From 1ee9be9f8edf2632f1e17a0f2a8ddc1d474e7140 Mon Sep 17 00:00:00 2001 From: maxi297 Date: Tue, 22 Apr 2025 14:01:11 -0400 Subject: [PATCH 01/31] upgrade cdk version --- .../connectors/source-bing-ads/poetry.lock | 713 ++++++++++-------- .../connectors/source-bing-ads/pyproject.toml | 4 +- .../source_bing_ads/bulk_streams.py | 9 +- .../unit_tests/integrations/base_test.py | 11 +- .../integrations/test_accounts_stream.py | 5 +- .../test_app_install_ad_labels_stream.py | 21 +- .../test_app_install_ads_stream.py | 21 +- .../integrations/test_budget_stream.py | 21 +- .../integrations/test_report_stream.py | 18 +- .../source-bing-ads/unit_tests/test_source.py | 4 - 10 files changed, 442 insertions(+), 385 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/poetry.lock b/airbyte-integrations/connectors/source-bing-ads/poetry.lock index 89c45cb99c03..8eaa4b106429 100644 --- a/airbyte-integrations/connectors/source-bing-ads/poetry.lock +++ b/airbyte-integrations/connectors/source-bing-ads/poetry.lock @@ -2,63 +2,70 @@ [[package]] name = "airbyte-cdk" -version = "5.17.0" +version = "6.45.8" description = "A framework for writing Airbyte Connectors." optional = false -python-versions = "<4.0,>=3.10" +python-versions = "<3.13,>=3.10" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "airbyte_cdk-5.17.0-py3-none-any.whl", hash = "sha256:135a8fc43b00a92169dfcdc43c1d7c629aba871a0b471f950ca5d76d3741fc92"}, - {file = "airbyte_cdk-5.17.0.tar.gz", hash = "sha256:5db70cbacec80ba3beabe4253480ab9a3947a450e8d0e39af4a91638b317b32a"}, + {file = "airbyte_cdk-6.45.8-py3-none-any.whl", hash = "sha256:d06738e6b25dce9f3fbf7118ae7de29a18085fe53e6331c3ec5210fdfdf39681"}, + {file = "airbyte_cdk-6.45.8.tar.gz", hash = "sha256:4c593a93e0d1d93a6d9a3914f092fdec25ad9e055b947cd3a54c4d9e0725cdb6"}, ] [package.dependencies] -airbyte-protocol-models-dataclasses = ">=0.13,<0.14" +airbyte-protocol-models-dataclasses = ">=0.15,<0.16" +anyascii = ">=0.3.2,<0.4.0" backoff = "*" +boltons = ">=25.0.0,<26.0.0" cachetools = "*" -cryptography = ">=42.0.5,<43.0.0" -Deprecated = ">=1.2,<1.3" +cryptography = ">=44.0.0,<45.0.0" dpath = ">=2.1.6,<3.0.0" -genson = "1.2.2" +dunamai = ">=1.22.0,<2.0.0" +genson = "1.3.0" 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" +jsonschema = ">=4.17.3,<4.18.0" langchain_core = "0.1.42" -nltk = "3.8.1" +nltk = "3.9.1" +numpy = "<2" orjson = ">=3.10.7,<4.0.0" +packaging = "*" pandas = "2.2.2" -pendulum = "<3.0.0" +psutil = "6.1.0" pydantic = ">=2.7,<3.0" pyjwt = ">=2.8.0,<3.0.0" pyrate-limiter = ">=3.1.0,<3.2.0" -python-dateutil = "*" -pytz = "2024.1" +python-dateutil = ">=2.9.0,<3.0.0" +python-ulid = ">=3.0.0,<4.0.0" +pytz = "2024.2" PyYAML = ">=6.0.1,<7.0.0" +rapidfuzz = ">=3.10.1,<4.0.0" requests = "*" requests_cache = "*" serpyco-rs = ">=1.10.2,<2.0.0" -wcmatch = "8.4" -xmltodict = ">=0.13.0,<0.14.0" +typing-extensions = "*" +wcmatch = "10.0" +whenever = ">=0.6.16,<0.7.0" +xmltodict = ">=0.13,<0.15" [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)", "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)"] +file-based = ["avro (>=1.11.2,<1.13.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=19.0.0,<20.0.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)"] 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)"] +vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.8.0)"] [[package]] name = "airbyte-protocol-models-dataclasses" -version = "0.13.1" +version = "0.15.0" 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" +python-versions = ">=3.9" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "airbyte_protocol_models_dataclasses-0.13.1-py3-none-any.whl", hash = "sha256:20a734b7b1c3479a643777830db6a2e0a34428f33d16abcfd320552576fabe5a"}, - {file = "airbyte_protocol_models_dataclasses-0.13.1.tar.gz", hash = "sha256:ec6a0fb6b16267bde910f52279445d06c8e1a3e4ed82ac2937b405ab280449d5"}, + {file = "airbyte_protocol_models_dataclasses-0.15.0-py3-none-any.whl", hash = "sha256:0fe8d7c2863c348b350efcf5f1af5872dc9071060408285e4708d97a9be5e2fb"}, + {file = "airbyte_protocol_models_dataclasses-0.15.0.tar.gz", hash = "sha256:a5bad4ee7ae0a04f1436967b7afd3306d28e1cd2e5acedf0cce588f0c80ed001"}, ] [[package]] @@ -74,6 +81,19 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "anyascii" +version = "0.3.2" +description = "Unicode to ASCII transliteration" +optional = false +python-versions = ">=3.3" +groups = ["main"] +markers = "python_version <= \"3.11\"" +files = [ + {file = "anyascii-0.3.2-py3-none-any.whl", hash = "sha256:3b3beef6fc43d9036d3b0529050b0c48bfad8bc960e9e562d7223cfb94fe45d4"}, + {file = "anyascii-0.3.2.tar.gz", hash = "sha256:9d5d32ef844fe225b8bc7cba7f950534fae4da27a9bf3a6bea2cb0ea46ce4730"}, +] + [[package]] name = "anyio" version = "4.8.0" @@ -161,6 +181,19 @@ files = [ requests = "*" suds-community = ">=1.1.0" +[[package]] +name = "boltons" +version = "25.0.0" +description = "When they're not builtins, they're boltons." +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version <= \"3.11\"" +files = [ + {file = "boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62"}, + {file = "boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace"}, +] + [[package]] name = "bracex" version = "2.5.post1" @@ -456,92 +489,92 @@ markers = {main = "python_version <= \"3.11\" and platform_system == \"Windows\" [[package]] name = "cryptography" -version = "42.0.8" +version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.7" +python-versions = "!=3.9.0,!=3.9.1,>=3.7" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"}, + {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"}, + {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"}, + {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"}, + {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"}, + {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"}, + {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"}, + {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"}, + {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"}, + {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"}, + {file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"}, ] [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] -name = "deprecated" -version = "1.2.18" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +name = "dpath" +version = "2.2.0" +description = "Filesystem-like pathing and searching for dictionaries" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, - {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, + {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, + {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, ] -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] - [[package]] -name = "dpath" -version = "2.2.0" -description = "Filesystem-like pathing and searching for dictionaries" +name = "dunamai" +version = "1.23.1" +description = "Dynamic version generation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, - {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, + {file = "dunamai-1.23.1-py3-none-any.whl", hash = "sha256:2611b0b9105a5797149ef82f4968a01dd912bdac857d49fc06856a4cfa58cf78"}, + {file = "dunamai-1.23.1.tar.gz", hash = "sha256:0b5712fc63bfb235263d912bfc5eb84590ba2201bb737268d25a5dbad7085489"}, ] +[package.dependencies] +packaging = ">=20.9" + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -576,14 +609,15 @@ python-dateutil = ">=2.7" [[package]] name = "genson" -version = "1.2.2" +version = "1.3.0" description = "GenSON is a powerful, user-friendly JSON Schema generator." optional = false python-versions = "*" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "genson-1.2.2.tar.gz", hash = "sha256:8caf69aa10af7aee0e1a1351d1d06801f4696e005f06cedef438635384346a16"}, + {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, + {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] [[package]] @@ -769,26 +803,24 @@ files = [ [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.17.3" description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = "*" +python-versions = ">=3.7" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, ] [package.dependencies] attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] name = "langchain-core" @@ -911,15 +943,15 @@ files = [ [[package]] name = "nltk" -version = "3.8.1" +version = "3.9.1" description = "Natural Language Toolkit" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, - {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, + {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, + {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, ] [package.dependencies] @@ -938,68 +970,49 @@ twitter = ["twython"] [[package]] name = "numpy" -version = "2.2.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71"}, - {file = "numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787"}, - {file = "numpy-2.2.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e37242f5324ffd9f7ba5acf96d774f9276aa62a966c0bad8dae692deebec7716"}, - {file = "numpy-2.2.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95172a21038c9b423e68be78fd0be6e1b97674cde269b76fe269a5dfa6fadf0b"}, - {file = "numpy-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b47c440210c5d1d67e1cf434124e0b5c395eee1f5806fdd89b553ed1acd0a3"}, - {file = "numpy-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0391ea3622f5c51a2e29708877d56e3d276827ac5447d7f45e9bc4ade8923c52"}, - {file = "numpy-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6b3dfc7661f8842babd8ea07e9897fe3d9b69a1d7e5fbb743e4160f9387833b"}, - {file = "numpy-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ad78ce7f18ce4e7df1b2ea4019b5817a2f6a8a16e34ff2775f646adce0a5027"}, - {file = "numpy-2.2.3-cp310-cp310-win32.whl", hash = "sha256:5ebeb7ef54a7be11044c33a17b2624abe4307a75893c001a4800857956b41094"}, - {file = "numpy-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:596140185c7fa113563c67c2e894eabe0daea18cf8e33851738c19f70ce86aeb"}, - {file = "numpy-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16372619ee728ed67a2a606a614f56d3eabc5b86f8b615c79d01957062826ca8"}, - {file = "numpy-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5521a06a3148686d9269c53b09f7d399a5725c47bbb5b35747e1cb76326b714b"}, - {file = "numpy-2.2.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7c8dde0ca2f77828815fd1aedfdf52e59071a5bae30dac3b4da2a335c672149a"}, - {file = "numpy-2.2.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:77974aba6c1bc26e3c205c2214f0d5b4305bdc719268b93e768ddb17e3fdd636"}, - {file = "numpy-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42f9c36d06440e34226e8bd65ff065ca0963aeecada587b937011efa02cdc9d"}, - {file = "numpy-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2712c5179f40af9ddc8f6727f2bd910ea0eb50206daea75f58ddd9fa3f715bb"}, - {file = "numpy-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c8b0451d2ec95010d1db8ca733afc41f659f425b7f608af569711097fd6014e2"}, - {file = "numpy-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9b4a8148c57ecac25a16b0e11798cbe88edf5237b0df99973687dd866f05e1b"}, - {file = "numpy-2.2.3-cp311-cp311-win32.whl", hash = "sha256:1f45315b2dc58d8a3e7754fe4e38b6fce132dab284a92851e41b2b344f6441c5"}, - {file = "numpy-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f48ba6f6c13e5e49f3d3efb1b51c8193215c42ac82610a04624906a9270be6f"}, - {file = "numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d"}, - {file = "numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95"}, - {file = "numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea"}, - {file = "numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532"}, - {file = "numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e"}, - {file = "numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe"}, - {file = "numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021"}, - {file = "numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8"}, - {file = "numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe"}, - {file = "numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d"}, - {file = "numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba"}, - {file = "numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50"}, - {file = "numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1"}, - {file = "numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5"}, - {file = "numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2"}, - {file = "numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1"}, - {file = "numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304"}, - {file = "numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d"}, - {file = "numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693"}, - {file = "numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b"}, - {file = "numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890"}, - {file = "numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c"}, - {file = "numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94"}, - {file = "numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0"}, - {file = "numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610"}, - {file = "numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76"}, - {file = "numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a"}, - {file = "numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf"}, - {file = "numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef"}, - {file = "numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082"}, - {file = "numpy-2.2.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3c2ec8a0f51d60f1e9c0c5ab116b7fc104b165ada3f6c58abf881cb2eb16044d"}, - {file = "numpy-2.2.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ed2cf9ed4e8ebc3b754d398cba12f24359f018b416c380f577bbae112ca52fc9"}, - {file = "numpy-2.2.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39261798d208c3095ae4f7bc8eaeb3481ea8c6e03dc48028057d3cbdbdb8937e"}, - {file = "numpy-2.2.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:783145835458e60fa97afac25d511d00a1eca94d4a8f3ace9fe2043003c678e4"}, - {file = "numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -1179,42 +1192,6 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d 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" -description = "Python datetimes made easy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "python_version <= \"3.11\"" -files = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, -] - -[package.dependencies] -python-dateutil = ">=2.6,<3.0" -pytzdata = ">=2020.1" - [[package]] name = "platformdirs" version = "4.3.6" @@ -1250,6 +1227,38 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +markers = "python_version <= \"3.11\"" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + [[package]] name = "pycparser" version = "2.22" @@ -1538,29 +1547,32 @@ files = [ six = ">=1.5" [[package]] -name = "pytz" -version = "2024.1" -description = "World timezone definitions, modern and historical" +name = "python-ulid" +version = "3.0.0" +description = "Universally unique lexicographically sortable identifier" optional = false -python-versions = "*" +python-versions = ">=3.9" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, + {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, ] +[package.extras] +pydantic = ["pydantic (>=2.0)"] + [[package]] -name = "pytzdata" -version = "2020.1" -description = "The Olson timezone database for Python." +name = "pytz" +version = "2024.2" +description = "World timezone definitions, modern and historical" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "*" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -1627,6 +1639,114 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "rapidfuzz" +version = "3.13.0" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version <= \"3.11\"" +files = [ + {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win32.whl", hash = "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win32.whl", hash = "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9"}, + {file = "rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8"}, +] + +[package.extras] +all = ["numpy"] + [[package]] name = "regex" version = "2024.11.6" @@ -1878,28 +1998,6 @@ files = [ attributes-doc = "*" typing-extensions = "*" -[[package]] -name = "setuptools" -version = "75.8.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version <= \"3.11\"" -files = [ - {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, - {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] - [[package]] name = "six" version = "1.17.0" @@ -2084,110 +2182,105 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "wcmatch" -version = "8.4" +version = "10.0" description = "Wildcard/glob file name matcher." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "wcmatch-8.4-py3-none-any.whl", hash = "sha256:dc7351e5a7f8bbf4c6828d51ad20c1770113f5f3fd3dfe2a03cfde2a63f03f98"}, - {file = "wcmatch-8.4.tar.gz", hash = "sha256:ba4fc5558f8946bf1ffc7034b05b814d825d694112499c86035e0e4d398b6a67"}, + {file = "wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a"}, + {file = "wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a"}, ] [package.dependencies] bracex = ">=2.1.1" [[package]] -name = "wrapt" -version = "1.17.2" -description = "Module for decorators, wrappers and monkey patching." +name = "whenever" +version = "0.6.17" +description = "Modern datetime library for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] markers = "python_version <= \"3.11\"" files = [ - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, - {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, - {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, - {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, - {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, - {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, - {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, - {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, - {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, - {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, - {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, - {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, - {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, - {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, - {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, - {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, - {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, + {file = "whenever-0.6.17-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:8e9e905fd19b0679e5ab1a0d0110a1974b89bf4cbd1ff22c9e352db381e4ae4f"}, + {file = "whenever-0.6.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cd615e60f992fb9ae9d73fc3581ac63de981e51013b0fffbf8e2bd748c71e3df"}, + {file = "whenever-0.6.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd717faa660771bf6f2fda4f75f2693cd79f2a7e975029123284ea3859fb329c"}, + {file = "whenever-0.6.17-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2ea744d9666be8880062da0d6dee690e8f70a2bc2a42b96ee17e10e36b0b5266"}, + {file = "whenever-0.6.17-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6b32593b44332660402c7e4c681cce6d7859b15a609d66ac3a28a6ad6357c2f"}, + {file = "whenever-0.6.17-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a01e4daaac24e0be48a6cb0bb03fa000a40126b1e9cb8d721ee116b2f44c1bb1"}, + {file = "whenever-0.6.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e88fe9fccb868ee88bb2ee8bfcbc55937d0b40747069f595f10b4832ff1545"}, + {file = "whenever-0.6.17-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2dce7b9faf23325b38ca713b2c7a150a8befc832995213a8ec46fe15af6a03e7"}, + {file = "whenever-0.6.17-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0925f7bf3448ef4f8c9b93de2d1270b82450a81b5d025a89f486ea61aa94319"}, + {file = "whenever-0.6.17-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:82203a572049070d685499dd695ff1914fee62f32aefa9e9952a60762217aa9e"}, + {file = "whenever-0.6.17-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c30e5b5b82783bc85169c8208ab3acf58648092515017b2a185a598160503dbb"}, + {file = "whenever-0.6.17-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:763e59062adc9adfbde45c3ad8b5f472b337cc5cebc70760627d004a4c286d33"}, + {file = "whenever-0.6.17-cp310-cp310-win32.whl", hash = "sha256:f71387bbe95cd98fc78653b942c6e02ff4245b6add012b3f11796220272984ce"}, + {file = "whenever-0.6.17-cp310-cp310-win_amd64.whl", hash = "sha256:996ab1f6f09bc9e0c699fa58937b5adc25e39e979ebbebfd77bae09221350f3d"}, + {file = "whenever-0.6.17-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:87e28378945182e822e211fcea9e89c7428749fd440b616d6d81365202cbed09"}, + {file = "whenever-0.6.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cf4ee3e8d5a55d788e8a79aeff29482dd4facc38241901f18087c3e662d16ba"}, + {file = "whenever-0.6.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97ffc43cd278f6f58732cd9d83c822faff3b1987c3b7b448b59b208cf6b6293"}, + {file = "whenever-0.6.17-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ce99533865fd63029fa64aef1cfbd42be1d2ced33da38c82f8c763986583982"}, + {file = "whenever-0.6.17-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68b88e023d64e8ccfabe04028738d8041eccd5a078843cd9b506e51df3375e84"}, + {file = "whenever-0.6.17-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9159bae31f2edaf5e70e4437d871e52f51e7e90f1b9faaac19a8c2bccba5170a"}, + {file = "whenever-0.6.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f9c4ee1f1e85f857507d146d56973db28d148f50883babf1da3d24a40bbcf60"}, + {file = "whenever-0.6.17-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0acd8b3238aa28a20d1f93c74fd84c9b59e2662e553a55650a0e663a81d2908d"}, + {file = "whenever-0.6.17-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ae238cd46567b5741806517d307a81cca45fd49902312a9bdde27db5226e8825"}, + {file = "whenever-0.6.17-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:99f72853e8292284c2a89a06ab826892216c04540a0ca84b3d3eaa9317dbe026"}, + {file = "whenever-0.6.17-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ccb6c77b497d651a283ef0f40ada326602b313ee71d22015f53d5496124dfc10"}, + {file = "whenever-0.6.17-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a1918c9836dc331cd9a39175806668b57b93d538d288469ad8bedb144ec11b"}, + {file = "whenever-0.6.17-cp311-cp311-win32.whl", hash = "sha256:72492f130a8c5b8abb2d7b16cec33b6d6ed9e294bb63c56ab1030623de4ae343"}, + {file = "whenever-0.6.17-cp311-cp311-win_amd64.whl", hash = "sha256:88dc4961f8f6cd16d9b70db022fd6c86193fad429f98daeb82c8e9ba0ca27e5c"}, + {file = "whenever-0.6.17-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d72c2413e32e3f382f6def337961ea7f20e66d0452ebc02e2fa215e1c45df73e"}, + {file = "whenever-0.6.17-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d12b891d780d9c98585b507e9f85097085337552b75f160ce6930af96509faa1"}, + {file = "whenever-0.6.17-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:503aaf2acfd5a7926ca5c6dc6ec09fc6c2891f536ab9cbd26a072c94bda3927f"}, + {file = "whenever-0.6.17-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6de09bcddfeb61c822019e88d8abed9ccc1d4f9d1a3a5d62d28d94d2fb6daff5"}, + {file = "whenever-0.6.17-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdfe430df7f336d8793b6b844f0d2552e1589e39e72b7414ba67139b9b402bed"}, + {file = "whenever-0.6.17-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99776635ac174a3df4a372bfae7420b3de965044d69f2bee08a7486cabba0aaa"}, + {file = "whenever-0.6.17-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdbb6d8dae94b492370949c8d8bf818f9ee0b4a08f304dadf9d6d892b7513676"}, + {file = "whenever-0.6.17-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:45d66e68cdca52ca3e6e4990515d32f6bc4eb6a24ff8cbcbe4df16401dd2d3c7"}, + {file = "whenever-0.6.17-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73947bd633bc658f8a8e2ff2bff34ee7caabd6edd9951bb2d778e6071c772df4"}, + {file = "whenever-0.6.17-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9f9d5b108f9abf39471e3d5ef22ff2fed09cc51a0cfa63c833c393b21b8bdb81"}, + {file = "whenever-0.6.17-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a42231e7623b50a60747a752a97499f6ad03e03ce128bf97ded84e12b0f4a77e"}, + {file = "whenever-0.6.17-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a6d9458d544006131e1210343bf660019abfa11d46f5be8ad2d7616dc82340f4"}, + {file = "whenever-0.6.17-cp312-cp312-win32.whl", hash = "sha256:ca1eda94ca2ef7ad1a1249ea80949be252e78a0f10463e12c81ad126ec6b99e5"}, + {file = "whenever-0.6.17-cp312-cp312-win_amd64.whl", hash = "sha256:fd7de20d6bbb74c6bad528c0346ef679957db21ce8a53f118e53b5f60f76495b"}, + {file = "whenever-0.6.17-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca9ee5b2b04c5a65112f55ff4a4efcba185f45b95766b669723e8b9a28bdb50b"}, + {file = "whenever-0.6.17-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bef0cf1cd4282044d98e4af9969239dc139e5b192896d4110d0d3f4139bdb30"}, + {file = "whenever-0.6.17-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04ac4e1fc1bc0bfb35f2c6a05d52de9fec297ea84ee60c655dec258cca1e6eb7"}, + {file = "whenever-0.6.17-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c792f96d021ba2883e6f4b70cc58b5d970f026eb156ff93866686e27a7cce93"}, + {file = "whenever-0.6.17-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a7f938b5533e751702de95a615b7903457a7618b94aef72c062fa871ad691b"}, + {file = "whenever-0.6.17-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47d2dbb85c512e28c14eede36a148afbb90baa340e113b39b2b9f0e9a3b192dd"}, + {file = "whenever-0.6.17-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea2b49a91853c133e8954dffbf180adca539b3719fd269565bf085ba97b47f5f"}, + {file = "whenever-0.6.17-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:91fcb2f42381a8ad763fc7ee2259375b1ace1306a02266c195af27bd3696e0da"}, + {file = "whenever-0.6.17-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32e4d5e3429015a5082cd171ceea633c6ea565d90491005cdcef49a7d6a17c99"}, + {file = "whenever-0.6.17-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f05731f530e4af29582a70cf02f8441027a4534e67b7c484efdf210fc09d0421"}, + {file = "whenever-0.6.17-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0d417b7de29aea2cfa7ea47f344848491d44291f28c038df869017ae66a50b48"}, + {file = "whenever-0.6.17-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8208333ece7f2e0c232feeecbd21bde3888c6782d3b08372ae8b5269938645b3"}, + {file = "whenever-0.6.17-cp313-cp313-win32.whl", hash = "sha256:c4912104731fd2be89cd031d8d34227225f1fae5181f931b91f217e69ded48ff"}, + {file = "whenever-0.6.17-cp313-cp313-win_amd64.whl", hash = "sha256:4f46ad87fab336d7643e0c2248dcd27a0f4ae42ac2c5e864a9d06a8f5538efd0"}, + {file = "whenever-0.6.17-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:53f03ae8c54aa60f5f22c790eb63ad644e97f8fba4b22337572a4e16bc4abb73"}, + {file = "whenever-0.6.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42fce832892578455d46870dc074521e627ba9272b839a8297784059170030f5"}, + {file = "whenever-0.6.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ac0786d6cb479275ea627d84536f38b6a408348961856e2e807d82d4dc768ed"}, + {file = "whenever-0.6.17-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e2f490b5e90b314cf7615435e24effe2356b57fa907fedb98fe58d49c6109c5"}, + {file = "whenever-0.6.17-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c1f25ab893cfa724b319a838ef60b918bd35be8f3f6ded73e6fd6e508b5237e"}, + {file = "whenever-0.6.17-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac5f644d0d3228e806b5129cebfb824a5e26553a0d47d89fc9e962cffa1b99ed"}, + {file = "whenever-0.6.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185309314b1abcc14c18597dd0dfe7fd8b39670f63a7d9357544994cba0e251"}, + {file = "whenever-0.6.17-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cc78b8a73a71241bf356743dd76133ccf796616823d8bbe170701a51d10b9fd3"}, + {file = "whenever-0.6.17-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0ea05123a0b3673c7cf3ea1fe3d8aa9362571db59f8ea15d7a8fb05d885fd756"}, + {file = "whenever-0.6.17-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9f0c874dbb49c3a733ce4dde86ffa243f166b9d1db4195e05127ec352b49d617"}, + {file = "whenever-0.6.17-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:86cfbd724b11e8a419056211381bde4c1d35ead4bea8d498c85bee3812cf4e7c"}, + {file = "whenever-0.6.17-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e1514f4a3094f11e1ad63b9defadf375d953709c7806cc1d2396634a7b00a009"}, + {file = "whenever-0.6.17-cp39-cp39-win32.whl", hash = "sha256:715ed172e929327c1b68e107f0dc9520237d92e11c26db95fd05869724f3e9d9"}, + {file = "whenever-0.6.17-cp39-cp39-win_amd64.whl", hash = "sha256:5fed15042b2b0ea44cafb8b7426e99170d3f4cd64dbeb966c77f14985e724d82"}, + {file = "whenever-0.6.17.tar.gz", hash = "sha256:9c4bfe755c8f06726c4031dbbecd0a7710e2058bc2f3b4e4e331755af015f55f"}, ] +[package.dependencies] +tzdata = {version = ">=2020.1", markers = "sys_platform == \"win32\""} + [[package]] name = "xmltodict" version = "0.13.0" @@ -2204,4 +2297,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12" -content-hash = "4035d1efeb1d9f1c73574f4775d89bee3ec740b0dfde4b7f095e3ac749f66158" +content-hash = "0b05e73839abf639c79cc1566ba24683f667e9531e03904d66568884d04389d1" diff --git a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml index 25c7d105522e..f186a95467de 100644 --- a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml +++ b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml @@ -19,7 +19,7 @@ include = "source_bing_ads" python = "^3.10,<3.12" bingads = "==13.0.18.1" urllib3 = "==1.26.18" -airbyte-cdk = "^5" +airbyte-cdk = "^6" cached-property = "==1.5.2" [tool.poetry.scripts] @@ -29,7 +29,7 @@ source-bing-ads = "source_bing_ads.run:run" freezegun = "^1.4.0" pytest-mock = "^3.6.1" pytest = "^8.0.0" -requests-mock = "^1.9.3" +requests-mock = "^1.12.1" [tool.poe] diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/bulk_streams.py b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/bulk_streams.py index 85e01f86d693..400243581557 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/bulk_streams.py +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/bulk_streams.py @@ -11,17 +11,20 @@ from numpy import nan from airbyte_cdk.models import SyncMode -from airbyte_cdk.sources.streams import IncrementalMixin +from airbyte_cdk.sources.streams import CheckpointMixin from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer from source_bing_ads.base_streams import Accounts, BingAdsBaseStream from source_bing_ads.utils import transform_bulk_datetime_format_to_rfc_3339 -class BingAdsBulkStream(BingAdsBaseStream, IncrementalMixin, ABC): +class BingAdsBulkStream(BingAdsBaseStream, CheckpointMixin, ABC): transformer: TypeTransformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization | TransformConfig.CustomSchemaNormalization) cursor_field = "Modified Time" primary_key = "Id" - _state = {} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._state = {} @staticmethod @transformer.registerCustomTransform diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index 219e4628f8f0..cfe3d6b44961 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -21,6 +21,15 @@ class BaseTest(TestCase): + def setUp(self) -> None: + self._http_mocker = HttpMocker() + self._http_mocker.__enter__() + + self._auth_client(self._http_mocker) + + def tearDown(self) -> None: + self._http_mocker.__exit__(None, None, None) + @property def service_manager(self) -> Union[ReportingServiceManager, BulkServiceManager]: pass @@ -38,7 +47,7 @@ def _state(self, file: str, stream_name: str) -> list[AirbyteStateMessage]: state = json.loads(f.read()) return StateBuilder().with_stream_state(stream_name, state).build() - def auth_client(self, http_mocker: HttpMocker) -> None: + def _auth_client(self, http_mocker: HttpMocker) -> None: http_mocker.post(request=build_request(self._config), responses=response_with_status("oauth", 200)) def read_stream( diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 01530c1fad97..1004fc6482f5 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -10,7 +10,6 @@ from airbyte_cdk.models import SyncMode from airbyte_cdk.test.catalog_builder import CatalogBuilder from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read -from airbyte_cdk.test.mock_http import HttpMocker class TestAccountsStream(BaseTest): @@ -28,10 +27,8 @@ def read_stream( catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() return read(SourceBingAds(), config, catalog, state, expecting_exception) - @HttpMocker() - def test_read_accounts_tax_certificate_data(self, http_mocker): + def test_read_accounts_tax_certificate_data(self): # Our account doesn't have configured Tax certificate. - self.auth_client(http_mocker) output = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config) assert output.records[0].record.data["TaxCertificate"] == { "Status": "Active", diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py index 534dcb61a5bd..483ab10e8581 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py @@ -4,7 +4,6 @@ from test_bulk_stream import TestBulkStream from airbyte_cdk.models import SyncMode -from airbyte_cdk.test.mock_http import HttpMocker class TestAppInstallAdLabelsStream(TestBulkStream): @@ -12,42 +11,32 @@ class TestAppInstallAdLabelsStream(TestBulkStream): account_id = "180535609" cursor_field = "Modified Time" - @HttpMocker() - def test_return_records_from_given_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_records_from_given_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels") assert len(output.records) == 1 - @HttpMocker() - def test_return_logged_info_for_empty_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels_empty") assert len(output.records) == 0 assert len(output.logs) == 11 - @HttpMocker() - def test_transform_records(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels") assert output.records for record in output.records: assert "Account Id" in record.record.data.keys() assert isinstance(record.record.data["Account Id"], int) - @HttpMocker() - def test_incremental_read_cursor_value_matches_value_from_most_recent_record(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_incremental_read_cursor_value_matches_value_from_most_recent_record(self): output, _ = self.read_stream(self.stream_name, SyncMode.incremental, self._config, "app_install_ad_labels_with_cursor_value") assert len(output.records) == 4 assert output.most_recent_state.stream_state.__dict__.get(self.account_id, {}) == { self.cursor_field: "2024-01-04T12:12:12.028+00:00" } - @HttpMocker() @freeze_time("2024-02-26") # mock current time as stream data available for 30 days only - def test_incremental_read_with_state(self, http_mocker: HttpMocker): + def test_incremental_read_with_state(self): state = self._state("app_install_ad_labels_state", self.stream_name) - self.auth_client(http_mocker) output, service_call_mock = self.read_stream( self.stream_name, SyncMode.incremental, self._config, "app_install_ad_labels_with_state", state ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py index 913bf6105f00..babd027ae9a0 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py @@ -4,7 +4,6 @@ from test_bulk_stream import TestBulkStream from airbyte_cdk.models import SyncMode -from airbyte_cdk.test.mock_http import HttpMocker class TestAppInstallAdsStream(TestBulkStream): @@ -12,42 +11,32 @@ class TestAppInstallAdsStream(TestBulkStream): account_id = "180535609" cursor_field = "Modified Time" - @HttpMocker() - def test_return_records_from_given_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_records_from_given_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads") assert len(output.records) == 1 - @HttpMocker() - def test_return_logged_info_for_empty_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads_empty") assert len(output.records) == 0 assert len(output.logs) == 11 - @HttpMocker() - def test_transform_records(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads") assert output.records for record in output.records: assert "Account Id" in record.record.data.keys() assert isinstance(record.record.data["Account Id"], int) - @HttpMocker() - def test_incremental_read_cursor_value_matches_value_from_most_recent_record(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_incremental_read_cursor_value_matches_value_from_most_recent_record(self): output, _ = self.read_stream(self.stream_name, SyncMode.incremental, self._config, "app_install_ads_with_cursor_value") assert len(output.records) == 4 assert output.most_recent_state.stream_state.__dict__.get(self.account_id, {}) == { self.cursor_field: "2024-03-01T12:49:12.028+00:00" } - @HttpMocker() @freeze_time("2023-12-29") # mock current time as stream data available for 30 days only - def test_incremental_read_with_state(self, http_mocker: HttpMocker): + def test_incremental_read_with_state(self): state = self._state("app_install_ads_state", self.stream_name) - self.auth_client(http_mocker) output, service_call_mock = self.read_stream( self.stream_name, SyncMode.incremental, self._config, "app_install_ads_with_state", state ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py index 6ac874274e0f..a784c19b1928 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py @@ -4,7 +4,6 @@ from test_bulk_stream import TestBulkStream from airbyte_cdk.models import SyncMode -from airbyte_cdk.test.mock_http import HttpMocker class TestBudgetStream(TestBulkStream): @@ -12,40 +11,30 @@ class TestBudgetStream(TestBulkStream): account_id = "180535609" cursor_field = "Modified Time" - @HttpMocker() - def test_return_records_from_given_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_records_from_given_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget") assert len(output.records) == 1 - @HttpMocker() - def test_return_logged_info_for_empty_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget_empty") assert len(output.records) == 0 assert len(output.logs) == 11 - @HttpMocker() - def test_transform_records(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget") assert output.records for record in output.records: assert "Account Id" in record.record.data.keys() assert isinstance(record.record.data["Account Id"], int) - @HttpMocker() - def test_incremental_read_cursor_value_matches_value_from_most_recent_record(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_incremental_read_cursor_value_matches_value_from_most_recent_record(self): output, _ = self.read_stream(self.stream_name, SyncMode.incremental, self._config, "budget_with_cursor_value") assert len(output.records) == 8 assert output.most_recent_state.stream_state.__dict__.get(self.account_id) == {self.cursor_field: "2024-01-01T12:54:12.028+00:00"} - @HttpMocker() @freeze_time("2024-02-26") # mock current time as stream data available for 30 days only - def test_incremental_read_with_state(self, http_mocker: HttpMocker): + def test_incremental_read_with_state(self): state = self._state("budget_state", self.stream_name) - self.auth_client(http_mocker) output, service_call_mock = self.read_stream(self.stream_name, SyncMode.incremental, self._config, "budget_with_state", state) assert len(output.records) == 8 assert output.most_recent_state.stream_state.__dict__.get(self.account_id) == {self.cursor_field: "2024-01-30T12:54:12.028+00:00"} diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_report_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_report_stream.py index 7829df1614d2..426c76aab66c 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_report_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_report_stream.py @@ -9,7 +9,6 @@ from config_builder import ConfigBuilder from airbyte_cdk.models import SyncMode -from airbyte_cdk.test.mock_http import HttpMocker class TestReportStream(BaseTest): @@ -48,35 +47,28 @@ class TestSuiteReportStream(TestReportStream): cursor_field = "TimePeriod" def setUp(self): + super().setUp() if not self.stream_name: self.skipTest("Skipping TestSuiteReportStream") - @HttpMocker() - def test_return_records_from_given_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_return_records_from_given_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, self.report_file) assert len(output.records) == self.records_number - @HttpMocker() - def test_transform_records_from_given_csv_file(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_transform_records_from_given_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, self.report_file) assert len(output.records) == self.records_number for record in output.records: assert self.transform_field in record.record.data.keys() - @HttpMocker() - def test_incremental_read_returns_records(self, http_mocker: HttpMocker): - self.auth_client(http_mocker) + def test_incremental_read_returns_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.incremental, self._config, self.report_file) assert len(output.records) == self.records_number assert output.most_recent_state.stream_state.__dict__ == self.first_read_state - @HttpMocker() - def test_incremental_read_with_state_returns_records(self, http_mocker: HttpMocker): + def test_incremental_read_with_state_returns_records(self): state = self._state(self.state_file, self.stream_name) - self.auth_client(http_mocker) output, service_call_mock = self.read_stream( self.stream_name, SyncMode.incremental, self._config, self.incremental_report_file, state ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py index f53cac5a1080..25f77d8d279b 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py @@ -40,10 +40,6 @@ def test_source_check_connection_failed_invalid_creds(config, logger_mock): with patch.object(Accounts, "read_records", return_value=[]): connected, reason = SourceBingAds().check_connection(logger_mock, config=config) assert connected is False - assert ( - reason.internal_message - == "Failed to get OAuth access token by refresh token. The user could not be authenticated as the grant is expired. The user must sign in again." - ) @patch.object(source_bing_ads.source, "Client") From 2599e47fc4f25bcab1780848e032e440aa92733b Mon Sep 17 00:00:00 2001 From: maxi297 Date: Tue, 22 Apr 2025 14:07:46 -0400 Subject: [PATCH 02/31] update release information --- .../connectors/source-bing-ads/metadata.yaml | 4 +- .../connectors/source-bing-ads/pyproject.toml | 2 +- docs/integrations/sources/bing-ads.md | 195 +++++++++--------- 3 files changed, 102 insertions(+), 99 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml index 63bc51162105..b4d5522b6873 100644 --- a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml @@ -16,7 +16,7 @@ data: connectorSubtype: api connectorType: source definitionId: 47f25999-dd5e-4636-8c39-e7cea2453331 - dockerImageTag: 2.8.13 + dockerImageTag: 2.8.13-rc.1 dockerRepository: airbyte/source-bing-ads documentationUrl: https://docs.airbyte.com/integrations/sources/bing-ads erdUrl: https://dbdocs.io/airbyteio/source-bing-ads?view=relationships @@ -36,6 +36,8 @@ data: enabled: true releaseStage: generally_available releases: + rolloutConfiguration: + enableProgressiveRollout: true breakingChanges: 1.0.0: message: Version 1.0.0 removes the primary keys from the geographic performance report streams. This will prevent the connector from losing data in the incremental append+dedup sync mode because of deduplication and incorrect primary keys. A data reset and schema refresh of all the affected streams is required for the changes to take effect. diff --git a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml index f186a95467de..e538fcec19d9 100644 --- a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml +++ b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] -version = "2.8.13" +version = "2.8.13-rc.1" name = "source-bing-ads" description = "Source implementation for Bing Ads." authors = [ "Airbyte ",] diff --git a/docs/integrations/sources/bing-ads.md b/docs/integrations/sources/bing-ads.md index 19093c36f94f..cdf068b0b7aa 100644 --- a/docs/integrations/sources/bing-ads.md +++ b/docs/integrations/sources/bing-ads.md @@ -259,103 +259,104 @@ The Bing Ads API limits the number of requests for all Microsoft Advertising cli
Expand to review -| Version | Date | Pull Request | Subject | -|:--------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------| -| 2.8.13 | 2025-02-15 | [53882](https://github.com/airbytehq/airbyte/pull/53882) | Update dependencies | -| 2.8.12 | 2025-02-01 | [52930](https://github.com/airbytehq/airbyte/pull/52930) | Update dependencies | -| 2.8.11 | 2025-01-25 | [52198](https://github.com/airbytehq/airbyte/pull/52198) | Update dependencies | -| 2.8.10 | 2025-01-18 | [51735](https://github.com/airbytehq/airbyte/pull/51735) | Update dependencies | -| 2.8.9 | 2025-01-11 | [51230](https://github.com/airbytehq/airbyte/pull/51230) | Update dependencies | -| 2.8.8 | 2025-01-04 | [50905](https://github.com/airbytehq/airbyte/pull/50905) | Update dependencies | -| 2.8.7 | 2024-12-28 | [50443](https://github.com/airbytehq/airbyte/pull/50443) | Update dependencies | -| 2.8.6 | 2024-12-21 | [50181](https://github.com/airbytehq/airbyte/pull/50181) | Update dependencies | -| 2.8.5 | 2024-12-14 | [49283](https://github.com/airbytehq/airbyte/pull/49283) | Update dependencies | -| 2.8.4 | 2024-11-25 | [48650](https://github.com/airbytehq/airbyte/pull/48650) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | -| 2.8.3 | 2024-11-04 | [48169](https://github.com/airbytehq/airbyte/pull/48169) | Update dependencies | -| 2.8.2 | 2024-10-29 | [47850](https://github.com/airbytehq/airbyte/pull/47850) | Update dependencies | -| 2.8.1 | 2024-10-28 | [47093](https://github.com/airbytehq/airbyte/pull/47093) | Update dependencies | -| 2.8.0 | 2024-10-21 | [46991](https://github.com/airbytehq/airbyte/pull/46991) | Update CDK to v5 | -| 2.7.9 | 2024-10-12 | [46847](https://github.com/airbytehq/airbyte/pull/46847) | Update dependencies | -| 2.7.8 | 2024-10-05 | [46504](https://github.com/airbytehq/airbyte/pull/46504) | Update dependencies | -| 2.7.7 | 2024-09-28 | [46151](https://github.com/airbytehq/airbyte/pull/46151) | Update dependencies | -| 2.7.6 | 2024-09-21 | [45512](https://github.com/airbytehq/airbyte/pull/45512) | Update dependencies | -| 2.7.5 | 2024-09-07 | [45246](https://github.com/airbytehq/airbyte/pull/45246) | Update dependencies | -| 2.7.4 | 2024-08-31 | [44276](https://github.com/airbytehq/airbyte/pull/44276) | Update dependencies | -| 2.7.3 | 2024-08-12 | [43742](https://github.com/airbytehq/airbyte/pull/43742) | Update dependencies | -| 2.7.2 | 2024-08-10 | [43591](https://github.com/airbytehq/airbyte/pull/43591) | Update dependencies | -| 2.7.1 | 2024-08-03 | [43245](https://github.com/airbytehq/airbyte/pull/43245) | Update dependencies | -| 2.7.0 | 2024-07-31 | [42548](https://github.com/airbytehq/airbyte/pull/42548) | Migrate to CDK v4.1.0 | -| 2.6.12 | 2024-07-27 | [42812](https://github.com/airbytehq/airbyte/pull/42812) | Update dependencies | -| 2.6.11 | 2024-07-20 | [42360](https://github.com/airbytehq/airbyte/pull/42360) | Update dependencies | -| 2.6.10 | 2024-07-13 | [41875](https://github.com/airbytehq/airbyte/pull/41875) | Update dependencies | -| 2.6.9 | 2024-07-10 | [41383](https://github.com/airbytehq/airbyte/pull/41383) | Update dependencies | -| 2.6.8 | 2024-07-09 | [41314](https://github.com/airbytehq/airbyte/pull/41314) | Update dependencies | -| 2.6.7 | 2024-07-06 | [40906](https://github.com/airbytehq/airbyte/pull/40906) | Update dependencies | -| 2.6.6 | 2024-07-05 | [34966](https://github.com/airbytehq/airbyte/pull/34966) | Add support for Performance Max campaigns. | -| 2.6.5 | 2024-06-27 | [40585](https://github.com/airbytehq/airbyte/pull/40585) | Replaced deprecated AirbyteLogger with logging.Logger | -| 2.6.4 | 2024-06-25 | [40457](https://github.com/airbytehq/airbyte/pull/40457) | Update dependencies | -| 2.6.3 | 2024-06-22 | [40006](https://github.com/airbytehq/airbyte/pull/40006) | Update dependencies | -| 2.6.2 | 2024-06-06 | [39177](https://github.com/airbytehq/airbyte/pull/39177) | [autopull] Upgrade base image to v1.2.2 | -| 2.6.1 | 2024-05-02 | [36632](https://github.com/airbytehq/airbyte/pull/36632) | Schema descriptions | -| 2.6.0 | 2024-04-25 | [35878](https://github.com/airbytehq/airbyte/pull/35878) | Add missing fields in keyword_performance_report | -| 2.5.0 | 2024-03-21 | [35891](https://github.com/airbytehq/airbyte/pull/35891) | Accounts stream: add TaxCertificate field to schema | -| 2.4.0 | 2024-03-19 | [36267](https://github.com/airbytehq/airbyte/pull/36267) | Pin airbyte-cdk version to `^0` | -| 2.3.0 | 2024-03-05 | [35812](https://github.com/airbytehq/airbyte/pull/35812) | New streams: Audience Performance Report, Goals And Funnels Report, Product Dimension Performance Report. | -| 2.2.0 | 2024-02-13 | [35201](https://github.com/airbytehq/airbyte/pull/35201) | New streams: Budget and Product Dimension Performance. | -| 2.1.4 | 2024-02-12 | [35179](https://github.com/airbytehq/airbyte/pull/35179) | Manage dependencies with Poetry | -| 2.1.3 | 2024-01-31 | [34712](https://github.com/airbytehq/airbyte/pull/34712) | Fix duplicated records for report-based streams | -| 2.1.2 | 2024-01-09 | [34045](https://github.com/airbytehq/airbyte/pull/34045) | Speed up record transformation | -| 2.1.1 | 2023-12-15 | [33500](https://github.com/airbytehq/airbyte/pull/33500) | Fix state setter when state was provided | -| 2.1.0 | 2023-12-05 | [33095](https://github.com/airbytehq/airbyte/pull/33095) | Add account filtering | -| 2.0.1 | 2023-11-16 | [32597](https://github.com/airbytehq/airbyte/pull/32597) | Fix start date parsing from stream state | -| 2.0.0 | 2023-11-07 | [31995](https://github.com/airbytehq/airbyte/pull/31995) | Schema update for Accounts, Campaigns and Search Query Performance Report streams. Convert `date` and `date-time` fields to standard `RFC3339` | -| 1.13.0 | 2023-11-13 | [32306](https://github.com/airbytehq/airbyte/pull/32306) | Add Custom reports and decrease backoff max tries number | -| 1.12.1 | 2023-11-10 | [32422](https://github.com/airbytehq/airbyte/pull/32422) | Normalize numeric values in reports | -| 1.12.0 | 2023-11-09 | [32340](https://github.com/airbytehq/airbyte/pull/32340) | Remove default start date in favor of Time Period - Last Year and This Year, if start date is not provided | -| 1.11.0 | 2023-11-06 | [32201](https://github.com/airbytehq/airbyte/pull/32201) | Skip broken CSV report files | -| 1.10.0 | 2023-11-06 | [32148](https://github.com/airbytehq/airbyte/pull/32148) | Add new fields to stream Ads: "BusinessName", "CallToAction", "Headline", "Images", "Videos", "Text" | -| 1.9.0 | 2023-11-03 | [32131](https://github.com/airbytehq/airbyte/pull/32131) | Add "CampaignId", "AccountId", "CustomerId" fields to Ad Groups, Ads and Campaigns streams. | -| 1.8.0 | 2023-11-02 | [32059](https://github.com/airbytehq/airbyte/pull/32059) | Add new streams `CampaignImpressionPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.7.1 | 2023-11-02 | [32088](https://github.com/airbytehq/airbyte/pull/32088) | Raise config error when user does not have accounts | -| 1.7.0 | 2023-11-01 | [32027](https://github.com/airbytehq/airbyte/pull/32027) | Add new streams `AdGroupImpressionPerformanceReport` | -| 1.6.0 | 2023-10-31 | [32008](https://github.com/airbytehq/airbyte/pull/32008) | Add new streams `Keywords` | -| 1.5.0 | 2023-10-30 | [31952](https://github.com/airbytehq/airbyte/pull/31952) | Add new streams `Labels`, `App install ads`, `Keyword Labels`, `Campaign Labels`, `App Install Ad Labels`, `Ad Group Labels` | -| 1.4.0 | 2023-10-27 | [31885](https://github.com/airbytehq/airbyte/pull/31885) | Add new stream: `AccountImpressionPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.3.0 | 2023-10-26 | [31837](https://github.com/airbytehq/airbyte/pull/31837) | Add new stream: `UserLocationPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.2.0 | 2023-10-24 | [31783](https://github.com/airbytehq/airbyte/pull/31783) | Add new stream: `SearchQueryPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.1.0 | 2023-10-24 | [31712](https://github.com/airbytehq/airbyte/pull/31712) | Add new stream: `AgeGenderAudienceReport` (daily, hourly, weekly, monthly) | -| 1.0.2 | 2023-10-19 | [31599](https://github.com/airbytehq/airbyte/pull/31599) | Base image migration: remove Dockerfile and use the python-connector-base image | -| 1.0.1 | 2023-10-16 | [31432](https://github.com/airbytehq/airbyte/pull/31432) | Remove primary keys from the geographic performance reports - complete what was missed in version 1.0.0 | -| 1.0.0 | 2023-10-11 | [31277](https://github.com/airbytehq/airbyte/pull/31277) | Remove primary keys from the geographic performance reports | -| 0.2.3 | 2023-09-28 | [30834](https://github.com/airbytehq/airbyte/pull/30834) | Wrap auth error with the config error | -| 0.2.2 | 2023-09-27 | [30791](https://github.com/airbytehq/airbyte/pull/30791) | Fix missing fields for geographic performance reports | -| 0.2.1 | 2023-09-04 | [30128](https://github.com/airbytehq/airbyte/pull/30128) | Add increasing download timeout if ReportingDownloadException occurs | -| 0.2.0 | 2023-08-17 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Add Geographic Performance Report | -| 0.1.24 | 2023-06-22 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Retry request after facing temporary name resolution error | -| 0.1.23 | 2023-05-11 | [25996](https://github.com/airbytehq/airbyte/pull/25996) | Implement a retry logic if SSL certificate validation fails | -| 0.1.22 | 2023-05-08 | [24223](https://github.com/airbytehq/airbyte/pull/24223) | Add CampaignLabels report column in campaign performance report | -| 0.1.21 | 2023-04-28 | [25668](https://github.com/airbytehq/airbyte/pull/25668) | Add undeclared fields to accounts, campaigns, campaign_performance_report, keyword_performance_report and account_performance_report streams | -| 0.1.20 | 2023-03-09 | [23663](https://github.com/airbytehq/airbyte/pull/23663) | Add lookback window for performance reports in incremental mode | -| 0.1.19 | 2023-03-08 | [23868](https://github.com/airbytehq/airbyte/pull/23868) | Add dimensional-type columns for reports | -| 0.1.18 | 2023-01-30 | [22073](https://github.com/airbytehq/airbyte/pull/22073) | Fix null values in the `Keyword` column of `keyword_performance_report` streams | -| 0.1.17 | 2022-12-10 | [20005](https://github.com/airbytehq/airbyte/pull/20005) | Add `Keyword` to `keyword_performance_report` stream | -| 0.1.16 | 2022-10-12 | [17873](https://github.com/airbytehq/airbyte/pull/17873) | Fix: added missing campaign types in (Audience, Shopping and DynamicSearchAds) in campaigns stream | -| 0.1.15 | 2022-10-03 | [17505](https://github.com/airbytehq/airbyte/pull/17505) | Fix: limit cache size for ServiceClient instances | -| 0.1.14 | 2022-09-29 | [17403](https://github.com/airbytehq/airbyte/pull/17403) | Fix: limit cache size for ReportingServiceManager instances | -| 0.1.13 | 2022-09-29 | [17386](https://github.com/airbytehq/airbyte/pull/17386) | Migrate to per-stream states | -| 0.1.12 | 2022-09-05 | [16335](https://github.com/airbytehq/airbyte/pull/16335) | Added backoff for socket.timeout | -| 0.1.11 | 2022-08-25 | [15684](https://github.com/airbytehq/airbyte/pull/15684) (published in [15987](https://github.com/airbytehq/airbyte/pull/15987)) | Fixed log messages being unreadable | -| 0.1.10 | 2022-08-12 | [15602](https://github.com/airbytehq/airbyte/pull/15602) | Fixed bug caused Hourly Reports to crash due to invalid fields set | -| 0.1.9 | 2022-08-02 | [14862](https://github.com/airbytehq/airbyte/pull/14862) | Added missing columns | -| 0.1.8 | 2022-06-15 | [13801](https://github.com/airbytehq/airbyte/pull/13801) | All reports `hourly/daily/weekly/monthly` will be generated by default, these options are removed from input configuration | -| 0.1.7 | 2022-05-17 | [12937](https://github.com/airbytehq/airbyte/pull/12937) | Added OAuth2.0 authentication method, removed `redirect_uri` from input configuration | -| 0.1.6 | 2022-04-30 | [12500](https://github.com/airbytehq/airbyte/pull/12500) | Improve input configuration copy | -| 0.1.5 | 2022-01-01 | [11652](https://github.com/airbytehq/airbyte/pull/11652) | Rebump attempt after DockerHub failure at registring the 0.1.4 | -| 0.1.4 | 2022-03-22 | [11311](https://github.com/airbytehq/airbyte/pull/11311) | Added optional Redirect URI & Tenant ID to spec | -| 0.1.3 | 2022-01-14 | [9510](https://github.com/airbytehq/airbyte/pull/9510) | Fixed broken dependency that blocked connector's operations | -| 0.1.2 | 2021-12-14 | [8429](https://github.com/airbytehq/airbyte/pull/8429) | Update titles and descriptions | -| 0.1.1 | 2021-08-31 | [5750](https://github.com/airbytehq/airbyte/pull/5750) | Added reporting streams | -| 0.1.0 | 2021-07-22 | [4911](https://github.com/airbytehq/airbyte/pull/4911) | Initial release supported core streams \(Accounts, Campaigns, Ads, AdGroups\) | +| Version | Date | Pull Request | Subject | +|:--------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 2.8.13-rc.1 | 2025-02-15 | [58595](https://github.com/airbytehq/airbyte/pull/58595) | Update CDK version | +| 2.8.13 | 2025-02-15 | [53882](https://github.com/airbytehq/airbyte/pull/53882) | Update dependencies | +| 2.8.12 | 2025-02-01 | [52930](https://github.com/airbytehq/airbyte/pull/52930) | Update dependencies | +| 2.8.11 | 2025-01-25 | [52198](https://github.com/airbytehq/airbyte/pull/52198) | Update dependencies | +| 2.8.10 | 2025-01-18 | [51735](https://github.com/airbytehq/airbyte/pull/51735) | Update dependencies | +| 2.8.9 | 2025-01-11 | [51230](https://github.com/airbytehq/airbyte/pull/51230) | Update dependencies | +| 2.8.8 | 2025-01-04 | [50905](https://github.com/airbytehq/airbyte/pull/50905) | Update dependencies | +| 2.8.7 | 2024-12-28 | [50443](https://github.com/airbytehq/airbyte/pull/50443) | Update dependencies | +| 2.8.6 | 2024-12-21 | [50181](https://github.com/airbytehq/airbyte/pull/50181) | Update dependencies | +| 2.8.5 | 2024-12-14 | [49283](https://github.com/airbytehq/airbyte/pull/49283) | Update dependencies | +| 2.8.4 | 2024-11-25 | [48650](https://github.com/airbytehq/airbyte/pull/48650) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | +| 2.8.3 | 2024-11-04 | [48169](https://github.com/airbytehq/airbyte/pull/48169) | Update dependencies | +| 2.8.2 | 2024-10-29 | [47850](https://github.com/airbytehq/airbyte/pull/47850) | Update dependencies | +| 2.8.1 | 2024-10-28 | [47093](https://github.com/airbytehq/airbyte/pull/47093) | Update dependencies | +| 2.8.0 | 2024-10-21 | [46991](https://github.com/airbytehq/airbyte/pull/46991) | Update CDK to v5 | +| 2.7.9 | 2024-10-12 | [46847](https://github.com/airbytehq/airbyte/pull/46847) | Update dependencies | +| 2.7.8 | 2024-10-05 | [46504](https://github.com/airbytehq/airbyte/pull/46504) | Update dependencies | +| 2.7.7 | 2024-09-28 | [46151](https://github.com/airbytehq/airbyte/pull/46151) | Update dependencies | +| 2.7.6 | 2024-09-21 | [45512](https://github.com/airbytehq/airbyte/pull/45512) | Update dependencies | +| 2.7.5 | 2024-09-07 | [45246](https://github.com/airbytehq/airbyte/pull/45246) | Update dependencies | +| 2.7.4 | 2024-08-31 | [44276](https://github.com/airbytehq/airbyte/pull/44276) | Update dependencies | +| 2.7.3 | 2024-08-12 | [43742](https://github.com/airbytehq/airbyte/pull/43742) | Update dependencies | +| 2.7.2 | 2024-08-10 | [43591](https://github.com/airbytehq/airbyte/pull/43591) | Update dependencies | +| 2.7.1 | 2024-08-03 | [43245](https://github.com/airbytehq/airbyte/pull/43245) | Update dependencies | +| 2.7.0 | 2024-07-31 | [42548](https://github.com/airbytehq/airbyte/pull/42548) | Migrate to CDK v4.1.0 | +| 2.6.12 | 2024-07-27 | [42812](https://github.com/airbytehq/airbyte/pull/42812) | Update dependencies | +| 2.6.11 | 2024-07-20 | [42360](https://github.com/airbytehq/airbyte/pull/42360) | Update dependencies | +| 2.6.10 | 2024-07-13 | [41875](https://github.com/airbytehq/airbyte/pull/41875) | Update dependencies | +| 2.6.9 | 2024-07-10 | [41383](https://github.com/airbytehq/airbyte/pull/41383) | Update dependencies | +| 2.6.8 | 2024-07-09 | [41314](https://github.com/airbytehq/airbyte/pull/41314) | Update dependencies | +| 2.6.7 | 2024-07-06 | [40906](https://github.com/airbytehq/airbyte/pull/40906) | Update dependencies | +| 2.6.6 | 2024-07-05 | [34966](https://github.com/airbytehq/airbyte/pull/34966) | Add support for Performance Max campaigns. | +| 2.6.5 | 2024-06-27 | [40585](https://github.com/airbytehq/airbyte/pull/40585) | Replaced deprecated AirbyteLogger with logging.Logger | +| 2.6.4 | 2024-06-25 | [40457](https://github.com/airbytehq/airbyte/pull/40457) | Update dependencies | +| 2.6.3 | 2024-06-22 | [40006](https://github.com/airbytehq/airbyte/pull/40006) | Update dependencies | +| 2.6.2 | 2024-06-06 | [39177](https://github.com/airbytehq/airbyte/pull/39177) | [autopull] Upgrade base image to v1.2.2 | +| 2.6.1 | 2024-05-02 | [36632](https://github.com/airbytehq/airbyte/pull/36632) | Schema descriptions | +| 2.6.0 | 2024-04-25 | [35878](https://github.com/airbytehq/airbyte/pull/35878) | Add missing fields in keyword_performance_report | +| 2.5.0 | 2024-03-21 | [35891](https://github.com/airbytehq/airbyte/pull/35891) | Accounts stream: add TaxCertificate field to schema | +| 2.4.0 | 2024-03-19 | [36267](https://github.com/airbytehq/airbyte/pull/36267) | Pin airbyte-cdk version to `^0` | +| 2.3.0 | 2024-03-05 | [35812](https://github.com/airbytehq/airbyte/pull/35812) | New streams: Audience Performance Report, Goals And Funnels Report, Product Dimension Performance Report. | +| 2.2.0 | 2024-02-13 | [35201](https://github.com/airbytehq/airbyte/pull/35201) | New streams: Budget and Product Dimension Performance. | +| 2.1.4 | 2024-02-12 | [35179](https://github.com/airbytehq/airbyte/pull/35179) | Manage dependencies with Poetry | +| 2.1.3 | 2024-01-31 | [34712](https://github.com/airbytehq/airbyte/pull/34712) | Fix duplicated records for report-based streams | +| 2.1.2 | 2024-01-09 | [34045](https://github.com/airbytehq/airbyte/pull/34045) | Speed up record transformation | +| 2.1.1 | 2023-12-15 | [33500](https://github.com/airbytehq/airbyte/pull/33500) | Fix state setter when state was provided | +| 2.1.0 | 2023-12-05 | [33095](https://github.com/airbytehq/airbyte/pull/33095) | Add account filtering | +| 2.0.1 | 2023-11-16 | [32597](https://github.com/airbytehq/airbyte/pull/32597) | Fix start date parsing from stream state | +| 2.0.0 | 2023-11-07 | [31995](https://github.com/airbytehq/airbyte/pull/31995) | Schema update for Accounts, Campaigns and Search Query Performance Report streams. Convert `date` and `date-time` fields to standard `RFC3339` | +| 1.13.0 | 2023-11-13 | [32306](https://github.com/airbytehq/airbyte/pull/32306) | Add Custom reports and decrease backoff max tries number | +| 1.12.1 | 2023-11-10 | [32422](https://github.com/airbytehq/airbyte/pull/32422) | Normalize numeric values in reports | +| 1.12.0 | 2023-11-09 | [32340](https://github.com/airbytehq/airbyte/pull/32340) | Remove default start date in favor of Time Period - Last Year and This Year, if start date is not provided | +| 1.11.0 | 2023-11-06 | [32201](https://github.com/airbytehq/airbyte/pull/32201) | Skip broken CSV report files | +| 1.10.0 | 2023-11-06 | [32148](https://github.com/airbytehq/airbyte/pull/32148) | Add new fields to stream Ads: "BusinessName", "CallToAction", "Headline", "Images", "Videos", "Text" | +| 1.9.0 | 2023-11-03 | [32131](https://github.com/airbytehq/airbyte/pull/32131) | Add "CampaignId", "AccountId", "CustomerId" fields to Ad Groups, Ads and Campaigns streams. | +| 1.8.0 | 2023-11-02 | [32059](https://github.com/airbytehq/airbyte/pull/32059) | Add new streams `CampaignImpressionPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.7.1 | 2023-11-02 | [32088](https://github.com/airbytehq/airbyte/pull/32088) | Raise config error when user does not have accounts | +| 1.7.0 | 2023-11-01 | [32027](https://github.com/airbytehq/airbyte/pull/32027) | Add new streams `AdGroupImpressionPerformanceReport` | +| 1.6.0 | 2023-10-31 | [32008](https://github.com/airbytehq/airbyte/pull/32008) | Add new streams `Keywords` | +| 1.5.0 | 2023-10-30 | [31952](https://github.com/airbytehq/airbyte/pull/31952) | Add new streams `Labels`, `App install ads`, `Keyword Labels`, `Campaign Labels`, `App Install Ad Labels`, `Ad Group Labels` | +| 1.4.0 | 2023-10-27 | [31885](https://github.com/airbytehq/airbyte/pull/31885) | Add new stream: `AccountImpressionPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.3.0 | 2023-10-26 | [31837](https://github.com/airbytehq/airbyte/pull/31837) | Add new stream: `UserLocationPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.2.0 | 2023-10-24 | [31783](https://github.com/airbytehq/airbyte/pull/31783) | Add new stream: `SearchQueryPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.1.0 | 2023-10-24 | [31712](https://github.com/airbytehq/airbyte/pull/31712) | Add new stream: `AgeGenderAudienceReport` (daily, hourly, weekly, monthly) | +| 1.0.2 | 2023-10-19 | [31599](https://github.com/airbytehq/airbyte/pull/31599) | Base image migration: remove Dockerfile and use the python-connector-base image | +| 1.0.1 | 2023-10-16 | [31432](https://github.com/airbytehq/airbyte/pull/31432) | Remove primary keys from the geographic performance reports - complete what was missed in version 1.0.0 | +| 1.0.0 | 2023-10-11 | [31277](https://github.com/airbytehq/airbyte/pull/31277) | Remove primary keys from the geographic performance reports | +| 0.2.3 | 2023-09-28 | [30834](https://github.com/airbytehq/airbyte/pull/30834) | Wrap auth error with the config error | +| 0.2.2 | 2023-09-27 | [30791](https://github.com/airbytehq/airbyte/pull/30791) | Fix missing fields for geographic performance reports | +| 0.2.1 | 2023-09-04 | [30128](https://github.com/airbytehq/airbyte/pull/30128) | Add increasing download timeout if ReportingDownloadException occurs | +| 0.2.0 | 2023-08-17 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Add Geographic Performance Report | +| 0.1.24 | 2023-06-22 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Retry request after facing temporary name resolution error | +| 0.1.23 | 2023-05-11 | [25996](https://github.com/airbytehq/airbyte/pull/25996) | Implement a retry logic if SSL certificate validation fails | +| 0.1.22 | 2023-05-08 | [24223](https://github.com/airbytehq/airbyte/pull/24223) | Add CampaignLabels report column in campaign performance report | +| 0.1.21 | 2023-04-28 | [25668](https://github.com/airbytehq/airbyte/pull/25668) | Add undeclared fields to accounts, campaigns, campaign_performance_report, keyword_performance_report and account_performance_report streams | +| 0.1.20 | 2023-03-09 | [23663](https://github.com/airbytehq/airbyte/pull/23663) | Add lookback window for performance reports in incremental mode | +| 0.1.19 | 2023-03-08 | [23868](https://github.com/airbytehq/airbyte/pull/23868) | Add dimensional-type columns for reports | +| 0.1.18 | 2023-01-30 | [22073](https://github.com/airbytehq/airbyte/pull/22073) | Fix null values in the `Keyword` column of `keyword_performance_report` streams | +| 0.1.17 | 2022-12-10 | [20005](https://github.com/airbytehq/airbyte/pull/20005) | Add `Keyword` to `keyword_performance_report` stream | +| 0.1.16 | 2022-10-12 | [17873](https://github.com/airbytehq/airbyte/pull/17873) | Fix: added missing campaign types in (Audience, Shopping and DynamicSearchAds) in campaigns stream | +| 0.1.15 | 2022-10-03 | [17505](https://github.com/airbytehq/airbyte/pull/17505) | Fix: limit cache size for ServiceClient instances | +| 0.1.14 | 2022-09-29 | [17403](https://github.com/airbytehq/airbyte/pull/17403) | Fix: limit cache size for ReportingServiceManager instances | +| 0.1.13 | 2022-09-29 | [17386](https://github.com/airbytehq/airbyte/pull/17386) | Migrate to per-stream states | +| 0.1.12 | 2022-09-05 | [16335](https://github.com/airbytehq/airbyte/pull/16335) | Added backoff for socket.timeout | +| 0.1.11 | 2022-08-25 | [15684](https://github.com/airbytehq/airbyte/pull/15684) (published in [15987](https://github.com/airbytehq/airbyte/pull/15987)) | Fixed log messages being unreadable | +| 0.1.10 | 2022-08-12 | [15602](https://github.com/airbytehq/airbyte/pull/15602) | Fixed bug caused Hourly Reports to crash due to invalid fields set | +| 0.1.9 | 2022-08-02 | [14862](https://github.com/airbytehq/airbyte/pull/14862) | Added missing columns | +| 0.1.8 | 2022-06-15 | [13801](https://github.com/airbytehq/airbyte/pull/13801) | All reports `hourly/daily/weekly/monthly` will be generated by default, these options are removed from input configuration | +| 0.1.7 | 2022-05-17 | [12937](https://github.com/airbytehq/airbyte/pull/12937) | Added OAuth2.0 authentication method, removed `redirect_uri` from input configuration | +| 0.1.6 | 2022-04-30 | [12500](https://github.com/airbytehq/airbyte/pull/12500) | Improve input configuration copy | +| 0.1.5 | 2022-01-01 | [11652](https://github.com/airbytehq/airbyte/pull/11652) | Rebump attempt after DockerHub failure at registring the 0.1.4 | +| 0.1.4 | 2022-03-22 | [11311](https://github.com/airbytehq/airbyte/pull/11311) | Added optional Redirect URI & Tenant ID to spec | +| 0.1.3 | 2022-01-14 | [9510](https://github.com/airbytehq/airbyte/pull/9510) | Fixed broken dependency that blocked connector's operations | +| 0.1.2 | 2021-12-14 | [8429](https://github.com/airbytehq/airbyte/pull/8429) | Update titles and descriptions | +| 0.1.1 | 2021-08-31 | [5750](https://github.com/airbytehq/airbyte/pull/5750) | Added reporting streams | +| 0.1.0 | 2021-07-22 | [4911](https://github.com/airbytehq/airbyte/pull/4911) | Initial release supported core streams \(Accounts, Campaigns, Ads, AdGroups\) |
From a9c0e6cd58bcbe46c8c3842930496dcf61e8ecc2 Mon Sep 17 00:00:00 2001 From: maxi297 Date: Tue, 22 Apr 2025 14:16:02 -0400 Subject: [PATCH 03/31] fix release information --- airbyte-integrations/connectors/source-bing-ads/metadata.yaml | 2 +- airbyte-integrations/connectors/source-bing-ads/pyproject.toml | 2 +- docs/integrations/sources/bing-ads.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml index b4d5522b6873..8227facaf5b1 100644 --- a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml @@ -16,7 +16,7 @@ data: connectorSubtype: api connectorType: source definitionId: 47f25999-dd5e-4636-8c39-e7cea2453331 - dockerImageTag: 2.8.13-rc.1 + dockerImageTag: 2.9.0-rc.1 dockerRepository: airbyte/source-bing-ads documentationUrl: https://docs.airbyte.com/integrations/sources/bing-ads erdUrl: https://dbdocs.io/airbyteio/source-bing-ads?view=relationships diff --git a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml index e538fcec19d9..ec503b6429b0 100644 --- a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml +++ b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] -version = "2.8.13-rc.1" +version = "2.9.0-rc.1" name = "source-bing-ads" description = "Source implementation for Bing Ads." authors = [ "Airbyte ",] diff --git a/docs/integrations/sources/bing-ads.md b/docs/integrations/sources/bing-ads.md index cdf068b0b7aa..c8cf2526f5dc 100644 --- a/docs/integrations/sources/bing-ads.md +++ b/docs/integrations/sources/bing-ads.md @@ -261,7 +261,7 @@ The Bing Ads API limits the number of requests for all Microsoft Advertising cli | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 2.8.13-rc.1 | 2025-02-15 | [58595](https://github.com/airbytehq/airbyte/pull/58595) | Update CDK version | +| 2.9.0-rc.1 | 2025-04-23 | [58595](https://github.com/airbytehq/airbyte/pull/58595) | Update CDK version | | 2.8.13 | 2025-02-15 | [53882](https://github.com/airbytehq/airbyte/pull/53882) | Update dependencies | | 2.8.12 | 2025-02-01 | [52930](https://github.com/airbytehq/airbyte/pull/52930) | Update dependencies | | 2.8.11 | 2025-01-25 | [52198](https://github.com/airbytehq/airbyte/pull/52198) | Update dependencies | From 5c16ec453a7a8d7c2c70d43cd67e3707d462e7f6 Mon Sep 17 00:00:00 2001 From: maxi297 Date: Tue, 22 Apr 2025 14:24:50 -0400 Subject: [PATCH 04/31] adding pendulum as it was removed from transitive dep --- .../connectors/source-bing-ads/poetry.lock | 51 ++++++++++++++++++- .../connectors/source-bing-ads/pyproject.toml | 1 + 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/poetry.lock b/airbyte-integrations/connectors/source-bing-ads/poetry.lock index 8eaa4b106429..035cc1d232ae 100644 --- a/airbyte-integrations/connectors/source-bing-ads/poetry.lock +++ b/airbyte-integrations/connectors/source-bing-ads/poetry.lock @@ -1192,6 +1192,42 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d 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" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "python_version <= \"3.11\"" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + [[package]] name = "platformdirs" version = "4.3.6" @@ -1575,6 +1611,19 @@ files = [ {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "python_version <= \"3.11\"" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -2297,4 +2346,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12" -content-hash = "0b05e73839abf639c79cc1566ba24683f667e9531e03904d66568884d04389d1" +content-hash = "eb326fac6ee6f9acf3dcc6031b12edc95d845eec49d042e875785eedb64a2973" diff --git a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml index ec503b6429b0..805fbc08bd8e 100644 --- a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml +++ b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml @@ -21,6 +21,7 @@ bingads = "==13.0.18.1" urllib3 = "==1.26.18" airbyte-cdk = "^6" cached-property = "==1.5.2" +pendulum = "<3.0.0" [tool.poetry.scripts] source-bing-ads = "source_bing_ads.run:run" From 57cdf31e189f2aa49ed93fd2bededfcdd390d764 Mon Sep 17 00:00:00 2001 From: maxi297 Date: Wed, 23 Apr 2025 12:47:00 -0400 Subject: [PATCH 05/31] [TMP] move accounts to lowcode --- .../source_bing_ads/manifest.yaml | 104 ++++++++++++++++++ .../source-bing-ads/source_bing_ads/run.py | 49 ++++++++- .../source-bing-ads/source_bing_ads/source.py | 14 ++- 3 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml new file mode 100644 index 000000000000..1043eac61746 --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -0,0 +1,104 @@ +version: 6.7.0 + +type: DeclarativeSource + +check: + type: CheckStream + stream_names: + - accounts + +definitions: + authenticator: + type: OAuthAuthenticator + refresh_request_body: + environment: "production" + oauth_scope: "msads.manage" + scope: "https://ads.microsoft.com/msads.manage offline_access" + tenant: "common" + token_refresh_endpoint: 'https://login.microsoftonline.com/{{ config["tenant_id"] }}/oauth2/v2.0/token' + grant_type: refresh_token + client_id: '{{ config["client_id"] }}' + client_secret: '{{ config["client_secret"] }}' + refresh_token: '{{ config["refresh_token"] }}' + users_stream: + type: DeclarativeStream + name: users + primary_key: Id + schema_loader: + type: InlineSchemaLoader + schema: # this does not matter as we don't expose the stream as public + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: {} + retriever: + type: SimpleRetriever + requester: + type: HttpRequester + url_base: https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13/User/Query + http_method: POST + request_headers: + Content-Type: application/json + DeveloperToken: "{{ config['developer_token'] }}" + request_body_data: '{"UserId": null}' + authenticator: "#/definitions/authenticator" + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: ["User"] + schema_normalization: Default + accounts_stream: + type: DeclarativeStream + name: accounts + primary_key: Id + schema_loader: + type: JsonFileSchemaLoader + file_path: "./source_bing_ads/schemas/accounts.json" + retriever: + type: SimpleRetriever + requester: + type: HttpRequester + url_base: https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13/Accounts/Search + http_method: POST + request_headers: + Content-Type: application/json + DeveloperToken: "{{ config['developer_token'] }}" + request_body_json: + PageInfo: + Index: "{{ next_page_token.next_page_token }}" + Size: 1000 + Predicates: + - Field: UserId + Operator: Equals + Value: "'{{ stream_partition['user_id'] }}'" + ReturnAdditionalFields: TaxCertificate,AccountMode + authenticator: "#/definitions/authenticator" + paginator: + type: DefaultPaginator + pagination_strategy: + type: PageIncrement + inject_on_first_request: true + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: Id + partition_field: user_id + stream: + $ref: "#/definitions/users_stream" + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: ["Accounts"] + schema_normalization: Default # FIXME this does not work because the return types are different in REST (for example, `Id` is returned as string and therefore needs normalization) but the schema is improperly defined (number instead of integer) + +streams: + - $ref: "#/definitions/users_stream" + - $ref: "#/definitions/accounts_stream" + +concurrency_level: + type: ConcurrencyLevel + default_concurrency: 2 + max_concurrency: 10 diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py index 3dd73c2fec5e..4af5c4732092 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py @@ -4,11 +4,52 @@ import sys +import traceback +from datetime import datetime +from typing import List -from airbyte_cdk.entrypoint import launch +from orjson import orjson + +from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch, logger +from airbyte_cdk.exception_handler import init_uncaught_exception_handler +from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteMessageSerializer, AirbyteTraceMessage, TraceType, Type from source_bing_ads import SourceBingAds -def run(): - source = SourceBingAds() - launch(source, sys.argv[1:]) +def _get_source(args: List[str]): + catalog_path = AirbyteEntrypoint.extract_catalog(args) + config_path = AirbyteEntrypoint.extract_config(args) + state_path = AirbyteEntrypoint.extract_state(args) + try: + return SourceBingAds( + SourceBingAds.read_catalog(catalog_path) if catalog_path else None, + SourceBingAds.read_config(config_path) if config_path else None, + SourceBingAds.read_state(state_path) if state_path else None, + ) + except Exception as error: + print( + orjson.dumps( + AirbyteMessageSerializer.dump( + AirbyteMessage( + type=Type.TRACE, + trace=AirbyteTraceMessage( + type=TraceType.ERROR, + emitted_at=int(datetime.now().timestamp() * 1000), + error=AirbyteErrorTraceMessage( + message=f"Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance. Error: {error}", + stack_trace=traceback.format_exc(), + ), + ), + ) + ) + ).decode() + ) + return None + + +def run() -> None: + init_uncaught_exception_handler(logger) + _args = sys.argv[1:] + source = _get_source(_args) + if source: + launch(source, _args) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py index cb9253b902fb..429a9ec666e8 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py @@ -5,8 +5,8 @@ from itertools import product from typing import Any, List, Mapping, Optional, Tuple -from airbyte_cdk.models import FailureType, SyncMode -from airbyte_cdk.sources import AbstractSource +from airbyte_cdk import TState, YamlDeclarativeSource +from airbyte_cdk.models import ConfiguredAirbyteCatalog, FailureType, SyncMode from airbyte_cdk.sources.streams import Stream from airbyte_cdk.utils import AirbyteTracedException from source_bing_ads.base_streams import Accounts, AdGroups, Ads, Campaigns @@ -92,11 +92,14 @@ ) -class SourceBingAds(AbstractSource): +class SourceBingAds(YamlDeclarativeSource): """ Source implementation of Bing Ads API. Fetches advertising data from accounts """ + def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: TState, **kwargs): + super().__init__(catalog=catalog, config=config, state=state, **{"path_to_yaml": "manifest.yaml"}) + def check_connection(self, logger: logging.Logger, config: Mapping[str, Any]) -> Tuple[bool, Any]: try: client = Client(**config) @@ -148,9 +151,11 @@ def get_custom_reports(self, config: Mapping[str, Any], client: Client) -> List[ ] def streams(self, config: Mapping[str, Any]) -> List[Stream]: + declarative_streams = super().streams(config) + client = Client(**config) streams = [ - Accounts(client, config), + # Accounts(client, config), AdGroups(client, config), AdGroupLabels(client, config), AppInstallAds(client, config), @@ -188,4 +193,5 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: custom_reports = self.get_custom_reports(config, client) streams.extend(custom_reports) + streams.extend(declarative_streams) return streams From 5241bc0b21a5b034d53f88dbb0f4995ca440b6d6 Mon Sep 17 00:00:00 2001 From: maxi297 Date: Thu, 24 Apr 2025 09:19:14 -0400 Subject: [PATCH 06/31] fix schema, pagination and tenant --- .../source_bing_ads/manifest.yaml | 3 +- .../source_bing_ads/schemas/accounts.json | 43 ++++++++++--------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 1043eac61746..1a0b33743c8b 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -14,7 +14,7 @@ definitions: environment: "production" oauth_scope: "msads.manage" scope: "https://ads.microsoft.com/msads.manage offline_access" - tenant: "common" + tenant: "{{ config['tenant_id'] }}" token_refresh_endpoint: 'https://login.microsoftonline.com/{{ config["tenant_id"] }}/oauth2/v2.0/token' grant_type: refresh_token client_id: '{{ config["client_id"] }}' @@ -79,6 +79,7 @@ definitions: pagination_strategy: type: PageIncrement inject_on_first_request: true + page_size: 1000 partition_router: type: SubstreamPartitionRouter parent_stream_configs: diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json index 6dd1205bd3db..8da35addacc8 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json @@ -4,7 +4,7 @@ "properties": { "Id": { "description": "ID of the account", - "type": ["null", "number"] + "type": ["null", "integer"] }, "AccountFinancialStatus": { "description": "The financial status of the account", @@ -36,15 +36,18 @@ }, "LinkedAgencies": { "description": "The agencies linked to the account for management purposes.", - "type": ["null", "object"], - "properties": { - "Id": { - "description": "ID of the linked agency", - "type": ["null", "integer"] - }, - "Name": { - "description": "Name of the linked agency", - "type": ["null", "string"] + "type": ["null", "array"], + "items": { + "type": ["null", "object"], + "properties": { + "Id": { + "description": "ID of the linked agency", + "type": ["null", "integer"] + }, + "Name": { + "description": "Name of the linked agency", + "type": ["null", "string"] + } } } }, @@ -74,7 +77,7 @@ }, "Id": { "description": "ID of the business address", - "type": ["null", "number"] + "type": ["null", "integer"] }, "Line1": { "description": "Address line 1", @@ -112,7 +115,7 @@ }, "BackUpPaymentInstrumentId": { "description": "ID of the backup payment instrument", - "type": ["null", "number"] + "type": ["null", "integer"] }, "BillingThresholdAmount": { "description": "The threshold amount for billing", @@ -120,11 +123,11 @@ }, "BillToCustomerId": { "description": "Customer ID for billing", - "type": ["null", "number"] + "type": ["null", "integer"] }, "LastModifiedByUserId": { "description": "ID of the user who last modified the account", - "type": ["null", "number"] + "type": ["null", "integer"] }, "LastModifiedTime": { "description": "The date and time of the last modification", @@ -142,27 +145,27 @@ }, "ParentCustomerId": { "description": "ID of the parent customer", - "type": ["null", "number"] + "type": ["null", "integer"] }, "PauseReason": { "description": "Reason for pausing the account", - "type": ["null", "number"] + "type": ["null", "integer"] }, "PaymentMethodId": { "description": "ID of the payment method", - "type": ["null", "number"] + "type": ["null", "integer"] }, "PrimaryUserId": { "description": "ID of the primary user", - "type": ["null", "number"] + "type": ["null", "integer"] }, "SalesHouseCustomerId": { "description": "Customer ID for sales house", - "type": ["null", "number"] + "type": ["null", "integer"] }, "SoldToPaymentInstrumentId": { "description": "ID of the payment instrument for sales", - "type": ["null", "number"] + "type": ["null", "integer"] }, "TimeStamp": { "description": "Timestamp of the account", From 7f9ec6f4daea8e54bb83955923ccf56832fc249a Mon Sep 17 00:00:00 2001 From: maxi297 Date: Thu, 24 Apr 2025 09:42:09 -0400 Subject: [PATCH 07/31] remove fixme --- .../connectors/source-bing-ads/source_bing_ads/manifest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 1a0b33743c8b..0048ea431575 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -93,7 +93,7 @@ definitions: extractor: type: DpathExtractor field_path: ["Accounts"] - schema_normalization: Default # FIXME this does not work because the return types are different in REST (for example, `Id` is returned as string and therefore needs normalization) but the schema is improperly defined (number instead of integer) + schema_normalization: Default streams: - $ref: "#/definitions/users_stream" From b687270557a69132a68bb90f838dd2ee94979bbd Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 28 Apr 2025 15:28:34 -0700 Subject: [PATCH 08/31] mlc: initial changes to make unit tests pass --- .../connectors/source-bing-ads/poetry.lock | 497 ++++++++++++++---- .../unit_tests/integrations/base_test.py | 5 +- .../integrations/protocol_helpers.py | 26 + .../integrations/test_accounts_stream.py | 2 +- 4 files changed, 427 insertions(+), 103 deletions(-) create mode 100644 airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py diff --git a/airbyte-integrations/connectors/source-bing-ads/poetry.lock b/airbyte-integrations/connectors/source-bing-ads/poetry.lock index 035cc1d232ae..f128bab03883 100644 --- a/airbyte-integrations/connectors/source-bing-ads/poetry.lock +++ b/airbyte-integrations/connectors/source-bing-ads/poetry.lock @@ -1,16 +1,15 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "airbyte-cdk" -version = "6.45.8" +version = "6.47.2" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ - {file = "airbyte_cdk-6.45.8-py3-none-any.whl", hash = "sha256:d06738e6b25dce9f3fbf7118ae7de29a18085fe53e6331c3ec5210fdfdf39681"}, - {file = "airbyte_cdk-6.45.8.tar.gz", hash = "sha256:4c593a93e0d1d93a6d9a3914f092fdec25ad9e055b947cd3a54c4d9e0725cdb6"}, + {file = "airbyte_cdk-6.47.2-py3-none-any.whl", hash = "sha256:26d700d83aa11aeaf5f1d8fa9e5f5aefa88db19a01b7d53dbb8792af13e16d75"}, + {file = "airbyte_cdk-6.47.2.tar.gz", hash = "sha256:cee58b156cc6b238ba5c806c7d462b62691392ec536edbbfb41f81c0d85492c8"}, ] [package.dependencies] @@ -19,10 +18,12 @@ anyascii = ">=0.3.2,<0.4.0" backoff = "*" boltons = ">=25.0.0,<26.0.0" cachetools = "*" +click = ">=8.1.8,<9.0.0" cryptography = ">=44.0.0,<45.0.0" dpath = ">=2.1.6,<3.0.0" dunamai = ">=1.22.0,<2.0.0" genson = "1.3.0" +google-cloud-secret-manager = ">=2.17.0,<3.0.0" isodate = ">=0.6.1,<0.7.0" Jinja2 = ">=3.1.2,<3.2.0" jsonref = ">=0.2,<0.3" @@ -44,6 +45,7 @@ PyYAML = ">=6.0.1,<7.0.0" rapidfuzz = ">=3.10.1,<4.0.0" requests = "*" requests_cache = "*" +rich-click = ">=1.8.8,<2.0.0" serpyco-rs = ">=1.10.2,<2.0.0" typing-extensions = "*" wcmatch = "10.0" @@ -51,6 +53,7 @@ whenever = ">=0.6.16,<0.7.0" xmltodict = ">=0.13,<0.15" [package.extras] +dev = ["pytest (>=7,<8)"] file-based = ["avro (>=1.11.2,<1.13.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=19.0.0,<20.0.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)"] 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.8.0)"] @@ -62,7 +65,6 @@ description = "Declares the Airbyte Protocol using Python Dataclasses. Dataclass optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "airbyte_protocol_models_dataclasses-0.15.0-py3-none-any.whl", hash = "sha256:0fe8d7c2863c348b350efcf5f1af5872dc9071060408285e4708d97a9be5e2fb"}, {file = "airbyte_protocol_models_dataclasses-0.15.0.tar.gz", hash = "sha256:a5bad4ee7ae0a04f1436967b7afd3306d28e1cd2e5acedf0cce588f0c80ed001"}, @@ -75,7 +77,6 @@ description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" 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"}, @@ -88,7 +89,6 @@ description = "Unicode to ASCII transliteration" optional = false python-versions = ">=3.3" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "anyascii-0.3.2-py3-none-any.whl", hash = "sha256:3b3beef6fc43d9036d3b0529050b0c48bfad8bc960e9e562d7223cfb94fe45d4"}, {file = "anyascii-0.3.2.tar.gz", hash = "sha256:9d5d32ef844fe225b8bc7cba7f950534fae4da27a9bf3a6bea2cb0ea46ce4730"}, @@ -101,7 +101,6 @@ description = "High level compatibility layer for multiple asynchronous event lo optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -115,7 +114,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] trio = ["trio (>=0.26.1)"] [[package]] @@ -125,7 +124,6 @@ description = "PEP 224 implementation" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" 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"}, @@ -138,19 +136,18 @@ description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "backoff" @@ -159,7 +156,6 @@ description = "Function decoration for backoff and retry" optional = false python-versions = ">=3.7,<4.0" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, @@ -172,7 +168,6 @@ description = "A library to make working with the Bing Ads APIs and bulk service optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "bingads-13.0.18.1.tar.gz", hash = "sha256:7e861ac0d959d374519043c32d04db1fc8dd97f3a0566ea6bdca76bd60784f86"}, ] @@ -188,7 +183,6 @@ description = "When they're not builtins, they're boltons." optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "boltons-25.0.0-py3-none-any.whl", hash = "sha256:dc9fb38bf28985715497d1b54d00b62ea866eca3938938ea9043e254a3a6ca62"}, {file = "boltons-25.0.0.tar.gz", hash = "sha256:e110fbdc30b7b9868cb604e3f71d4722dd8f4dcb4a5ddd06028ba8f1ab0b5ace"}, @@ -201,7 +195,6 @@ description = "Bash style brace expander." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, @@ -214,7 +207,6 @@ description = "A decorator for caching properties in classes." optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, @@ -227,7 +219,6 @@ description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, @@ -240,7 +231,6 @@ description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -255,8 +245,8 @@ typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_ver bson = ["pymongo (>=4.4.0)"] cbor2 = ["cbor2 (>=5.4.6)"] msgpack = ["msgpack (>=1.0.5)"] -msgspec = ["msgspec (>=0.18.5)"] -orjson = ["orjson (>=3.9.2)"] +msgspec = ["msgspec (>=0.18.5) ; implementation_name == \"cpython\""] +orjson = ["orjson (>=3.9.2) ; implementation_name == \"cpython\""] pyyaml = ["pyyaml (>=6.0)"] tomlkit = ["tomlkit (>=0.11.8)"] ujson = ["ujson (>=5.7.0)"] @@ -268,7 +258,6 @@ description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -281,7 +270,7 @@ description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\" and platform_python_implementation != \"PyPy\"" +markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -362,7 +351,6 @@ description = "The Real First Universal Charset Detector. Open, modern and activ optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -465,7 +453,6 @@ description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -485,7 +472,7 @@ files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "python_version <= \"3.11\" and platform_system == \"Windows\"", dev = "python_version <= \"3.11\" and sys_platform == \"win32\""} +markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} [[package]] name = "cryptography" @@ -494,7 +481,6 @@ description = "cryptography is a package which provides cryptographic recipes an optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, @@ -537,10 +523,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -553,7 +539,6 @@ description = "Filesystem-like pathing and searching for dictionaries" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, @@ -566,7 +551,6 @@ description = "Dynamic version generation" optional = false python-versions = ">=3.5" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "dunamai-1.23.1-py3-none-any.whl", hash = "sha256:2611b0b9105a5797149ef82f4968a01dd912bdac857d49fc06856a4cfa58cf78"}, {file = "dunamai-1.23.1.tar.gz", hash = "sha256:0b5712fc63bfb235263d912bfc5eb84590ba2201bb737268d25a5dbad7085489"}, @@ -598,7 +582,6 @@ description = "Let your Python tests travel through time" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, @@ -614,12 +597,207 @@ description = "GenSON is a powerful, user-friendly JSON Schema generator." optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] +[[package]] +name = "google-api-core" +version = "2.24.2" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9"}, + {file = "google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.0" +googleapis-common-protos = ">=1.56.2,<2.0.0" +grpcio = [ + {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +grpcio-status = [ + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +proto-plus = ">=1.22.3,<2.0.0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" +requests = ">=2.18.0,<3.0.0" + +[package.extras] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev) ; python_version >= \"3.11\"", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0) ; python_version >= \"3.11\""] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.39.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_auth-2.39.0-py2.py3-none-any.whl", hash = "sha256:0150b6711e97fb9f52fe599f55648950cc4540015565d8fbb31be2ad6e1548a2"}, + {file = "google_auth-2.39.0.tar.gz", hash = "sha256:73222d43cdc35a3aeacbfdcaf73142a97839f10de930550d89ebfe1d0a00cde7"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "requests (>=2.20.0,<3.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] +pyjwt = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyjwt (>=2.0)"] +pyopenssl = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0)"] +testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] +urllib3 = ["packaging", "urllib3"] + +[[package]] +name = "google-cloud-secret-manager" +version = "2.23.3" +description = "Google Cloud Secret Manager API client library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_cloud_secret_manager-2.23.3-py3-none-any.whl", hash = "sha256:fe06ebb2f71eb739ecc6c14ea9e8dafcb9bbc6123b78b2f8986ece6733d23a1a"}, + {file = "google_cloud_secret_manager-2.23.3.tar.gz", hash = "sha256:598c4c0a9d10d49d500eb4aea3255dff250aa2f92c028f5c97e3b367f768c808"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0" +proto-plus = ">=1.22.3,<2.0.0" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" + +[[package]] +name = "googleapis-common-protos" +version = "1.70.0" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8"}, + {file = "googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257"}, +] + +[package.dependencies] +grpcio = {version = ">=1.44.0,<2.0.0", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0)"] + +[[package]] +name = "grpc-google-iam-v1" +version = "0.14.2" +description = "IAM API client library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "grpc_google_iam_v1-0.14.2-py3-none-any.whl", hash = "sha256:a3171468459770907926d56a440b2bb643eec1d7ba215f48f3ecece42b4d8351"}, + {file = "grpc_google_iam_v1-0.14.2.tar.gz", hash = "sha256:b3e1fc387a1a329e41672197d0ace9de22c78dd7d215048c4c78712073f7bd20"}, +] + +[package.dependencies] +googleapis-common-protos = {version = ">=1.56.0,<2.0.0", extras = ["grpc"]} +grpcio = ">=1.44.0,<2.0.0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" + +[[package]] +name = "grpcio" +version = "1.71.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "grpcio-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:c200cb6f2393468142eb50ab19613229dcc7829b5ccee8b658a36005f6669fdd"}, + {file = "grpcio-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b2266862c5ad664a380fbbcdbdb8289d71464c42a8c29053820ee78ba0119e5d"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0ab8b2864396663a5b0b0d6d79495657ae85fa37dcb6498a2669d067c65c11ea"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c30f393f9d5ff00a71bb56de4aa75b8fe91b161aeb61d39528db6b768d7eac69"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f250ff44843d9a0615e350c77f890082102a0318d66a99540f54769c8766ab73"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6d8de076528f7c43a2f576bc311799f89d795aa6c9b637377cc2b1616473804"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b91879d6da1605811ebc60d21ab6a7e4bae6c35f6b63a061d61eb818c8168f6"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f71574afdf944e6652203cd1badcda195b2a27d9c83e6d88dc1ce3cfb73b31a5"}, + {file = "grpcio-1.71.0-cp310-cp310-win32.whl", hash = "sha256:8997d6785e93308f277884ee6899ba63baafa0dfb4729748200fcc537858a509"}, + {file = "grpcio-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d6ac9481d9d0d129224f6d5934d5832c4b1cddb96b59e7eba8416868909786a"}, + {file = "grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef"}, + {file = "grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3"}, + {file = "grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444"}, + {file = "grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b"}, + {file = "grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537"}, + {file = "grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79"}, + {file = "grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a"}, + {file = "grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8"}, + {file = "grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379"}, + {file = "grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637"}, + {file = "grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb"}, + {file = "grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366"}, + {file = "grpcio-1.71.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c6a0a28450c16809f94e0b5bfe52cabff63e7e4b97b44123ebf77f448534d07d"}, + {file = "grpcio-1.71.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:a371e6b6a5379d3692cc4ea1cb92754d2a47bdddeee755d3203d1f84ae08e03e"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:39983a9245d37394fd59de71e88c4b295eb510a3555e0a847d9965088cdbd033"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9182e0063112e55e74ee7584769ec5a0b4f18252c35787f48738627e23a62b97"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693bc706c031aeb848849b9d1c6b63ae6bcc64057984bb91a542332b75aa4c3d"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:20e8f653abd5ec606be69540f57289274c9ca503ed38388481e98fa396ed0b41"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8700a2a57771cc43ea295296330daaddc0d93c088f0a35cc969292b6db959bf3"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d35a95f05a8a2cbe8e02be137740138b3b2ea5f80bd004444e4f9a1ffc511e32"}, + {file = "grpcio-1.71.0-cp39-cp39-win32.whl", hash = "sha256:f9c30c464cb2ddfbc2ddf9400287701270fdc0f14be5f08a1e3939f1e749b455"}, + {file = "grpcio-1.71.0-cp39-cp39-win_amd64.whl", hash = "sha256:63e41b91032f298b3e973b3fa4093cbbc620c875e2da7b93e249d4728b54559a"}, + {file = "grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.71.0)"] + +[[package]] +name = "grpcio-status" +version = "1.71.0" +description = "Status proto mapping for gRPC" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "grpcio_status-1.71.0-py3-none-any.whl", hash = "sha256:843934ef8c09e3e858952887467f8256aac3910c55f077a359a65b2b3cde3e68"}, + {file = "grpcio_status-1.71.0.tar.gz", hash = "sha256:11405fed67b68f406b3f3c7c5ae5104a79d2d309666d10d61b152e91d28fb968"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.71.0" +protobuf = ">=5.26.1,<6.0dev" + [[package]] name = "h11" version = "0.14.0" @@ -627,7 +805,6 @@ description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -640,7 +817,6 @@ description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -663,7 +839,6 @@ description = "The next generation HTTP client." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -676,7 +851,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -689,7 +864,6 @@ description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -705,7 +879,6 @@ description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -718,7 +891,6 @@ description = "An ISO 8601 date/time/duration parser and formatter" optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, @@ -734,7 +906,6 @@ description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -753,7 +924,6 @@ description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -766,7 +936,6 @@ description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -782,7 +951,6 @@ description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -795,7 +963,6 @@ description = "An implementation of JSON Reference for Python" optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "jsonref-0.2-py3-none-any.whl", hash = "sha256:b1e82fa0b62e2c2796a13e5401fe51790b248f6d9bf9d7212a3e31a3501b291f"}, {file = "jsonref-0.2.tar.gz", hash = "sha256:f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697"}, @@ -808,7 +975,6 @@ description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, @@ -829,7 +995,6 @@ description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "langchain_core-0.1.42-py3-none-any.whl", hash = "sha256:c5653ffa08a44f740295c157a24c0def4a753333f6a2c41f76bf431cd00be8b5"}, {file = "langchain_core-0.1.42.tar.gz", hash = "sha256:40751bf60ea5d8e2b2efe65290db434717ee3834870c002e40e2811f09d814e6"}, @@ -853,7 +1018,6 @@ description = "Client library to connect to the LangSmith LLM Tracing and Evalua optional = false python-versions = "<4.0,>=3.8.1" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15"}, {file = "langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a"}, @@ -869,6 +1033,31 @@ requests-toolbelt = ">=1.0.0,<2.0.0" [package.extras] langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "3.0.2" @@ -876,7 +1065,6 @@ description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -941,6 +1129,18 @@ files = [ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "nltk" version = "3.9.1" @@ -948,7 +1148,6 @@ description = "Natural Language Toolkit" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -975,7 +1174,6 @@ description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -1022,7 +1220,6 @@ description = "Fast, correct Python JSON library supporting dataclasses, datetim optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"}, {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"}, @@ -1112,7 +1309,6 @@ description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, @@ -1125,7 +1321,6 @@ description = "Powerful data structures for data analysis, time series, and stat optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" 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"}, @@ -1199,7 +1394,6 @@ description = "Python datetimes made easy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, @@ -1235,7 +1429,6 @@ description = "A small Python package for determining appropriate platform-speci optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -1253,7 +1446,6 @@ description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1263,6 +1455,45 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "proto-plus" +version = "1.26.1" +description = "Beautiful, Pythonic protocol buffers" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, + {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<7.0.0" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "5.29.4" +description = "" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, + {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, + {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, + {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, + {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, + {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, + {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, + {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, + {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, +] + [[package]] name = "psutil" version = "6.1.0" @@ -1270,7 +1501,6 @@ description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, @@ -1295,6 +1525,33 @@ files = [ dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] +[[package]] +name = "pyasn1" +version = "0.6.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, + {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, +] + +[package.dependencies] +pyasn1 = ">=0.6.1,<0.7.0" + [[package]] name = "pycparser" version = "2.22" @@ -1302,7 +1559,7 @@ description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\" and platform_python_implementation != \"PyPy\"" +markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -1315,7 +1572,6 @@ description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -1328,7 +1584,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -1337,7 +1593,6 @@ description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -1444,6 +1699,21 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pygments" +version = "2.19.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyjwt" version = "2.10.1" @@ -1451,7 +1721,6 @@ description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, @@ -1470,7 +1739,6 @@ description = "Python Rate-Limiter using Leaky-Bucket Algorithm" optional = false python-versions = ">=3.8,<4.0" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pyrate_limiter-3.1.1-py3-none-any.whl", hash = "sha256:c51906f1d51d56dc992ff6c26e8300e32151bc6cfa3e6559792e31971dfd4e2b"}, {file = "pyrate_limiter-3.1.1.tar.gz", hash = "sha256:2f57eda712687e6eccddf6afe8f8a15b409b97ed675fe64a626058f12863b7b7"}, @@ -1487,7 +1755,6 @@ description = "Persistent/Functional/Immutable data structures" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, @@ -1530,7 +1797,6 @@ description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -1554,7 +1820,6 @@ description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -1573,7 +1838,6 @@ description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1589,7 +1853,6 @@ description = "Universally unique lexicographically sortable identifier" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, @@ -1605,7 +1868,6 @@ description = "World timezone definitions, modern and historical" optional = false python-versions = "*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -1618,7 +1880,6 @@ description = "The Olson timezone database for Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, @@ -1631,7 +1892,6 @@ description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -1695,7 +1955,6 @@ description = "rapid fuzzy string matching" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"}, {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"}, @@ -1803,7 +2062,6 @@ description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -1908,7 +2166,6 @@ description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1931,7 +2188,6 @@ description = "A persistent cache for python requests" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"}, {file = "requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"}, @@ -1963,7 +2219,6 @@ description = "Mock out responses from the requests package" optional = false python-versions = ">=3.5" groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, @@ -1982,7 +2237,6 @@ description = "A utility belt for advanced users of python-requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -1991,6 +2245,62 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" +[[package]] +name = "rich" +version = "14.0.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, + {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rich-click" +version = "1.8.8" +description = "Format click help output nicely with rich" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "rich_click-1.8.8-py3-none-any.whl", hash = "sha256:205aabd5a98e64ab2c105dee9e368be27480ba004c7dfa2accd0ed44f9f1550e"}, + {file = "rich_click-1.8.8.tar.gz", hash = "sha256:547c618dea916620af05d4a6456da797fbde904c97901f44d2f32f89d85d6c84"}, +] + +[package.dependencies] +click = ">=7" +rich = ">=10.7" +typing_extensions = ">=4" + +[package.extras] +dev = ["mypy", "packaging", "pre-commit", "pytest", "pytest-cov", "rich-codex", "ruff", "types-setuptools"] +docs = ["markdown_include", "mkdocs", "mkdocs-glightbox", "mkdocs-material-extensions", "mkdocs-material[imaging] (>=9.5.18,<9.6.0)", "mkdocs-rss-plugin", "mkdocstrings[python]", "rich-codex"] + +[[package]] +name = "rsa" +version = "4.9.1" +description = "Pure-Python RSA implementation" +optional = false +python-versions = "<4,>=3.6" +groups = ["main"] +files = [ + {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, + {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + [[package]] name = "serpyco-rs" version = "1.13.0" @@ -1998,7 +2308,6 @@ description = "" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "serpyco_rs-1.13.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e722b3053e627d8a304e462bce20cae1670a2c4b0ef875b84d0de0081bec4029"}, {file = "serpyco_rs-1.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f10e89c752ff78d720a42e026b0a9ada70717ad6306a9356f794280167d62bf"}, @@ -2054,7 +2363,6 @@ description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -2067,7 +2375,6 @@ description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -2080,7 +2387,6 @@ description = "Lightweight SOAP client (community fork)" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "suds_community-1.2.0-py3-none-any.whl", hash = "sha256:505b191865bca125f12e8ff9598b24d9c0108b98826671bdd700ed51def44e36"}, {file = "suds_community-1.2.0.tar.gz", hash = "sha256:ab3b24dc9ba06b5e6598e2a5d34d2a7d06c79e613d81cedc028475bfbd3bb90c"}, @@ -2093,7 +2399,6 @@ description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, @@ -2153,7 +2458,6 @@ description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -2176,7 +2480,6 @@ description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -2189,7 +2492,6 @@ description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, @@ -2202,7 +2504,6 @@ description = "URL normalization for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, @@ -2218,15 +2519,14 @@ description = "HTTP library with thread-safe connection pooling, file post, and optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" groups = ["main", "dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -2236,7 +2536,6 @@ description = "Wildcard/glob file name matcher." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a"}, {file = "wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a"}, @@ -2252,7 +2551,6 @@ description = "Modern datetime library for Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "whenever-0.6.17-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:8e9e905fd19b0679e5ab1a0d0110a1974b89bf4cbd1ff22c9e352db381e4ae4f"}, {file = "whenever-0.6.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cd615e60f992fb9ae9d73fc3581ac63de981e51013b0fffbf8e2bd748c71e3df"}, @@ -2337,7 +2635,6 @@ description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.4" groups = ["main"] -markers = "python_version <= \"3.11\"" files = [ {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, @@ -2346,4 +2643,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12" -content-hash = "eb326fac6ee6f9acf3dcc6031b12edc95d845eec49d042e875785eedb64a2973" +content-hash = "a72f4c5881ac18da12ff060cf93d769b0a745b1b2799e3a6216e00f16231c171" diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index cfe3d6b44961..03067d9c8954 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -18,7 +18,7 @@ from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read from airbyte_cdk.test.mock_http import HttpMocker from airbyte_cdk.test.state_builder import StateBuilder - +from protocol_helpers import read_helper class BaseTest(TestCase): def setUp(self) -> None: @@ -64,4 +64,5 @@ def read_stream( self.service_manager, "download_file", return_value=self._download_file(stream_data_file) ) as service_call_mock: catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() - return read(SourceBingAds(), config, catalog, state, expecting_exception), service_call_mock + # return read(SourceBingAds(), config, catalog, state, expecting_exception), service_call_mock + return read_helper(config, catalog, state, expecting_exception), service_call_mock diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py new file mode 100644 index 000000000000..62ba5034cab1 --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py @@ -0,0 +1,26 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + + +from typing import Any, Dict, Optional + +from source_bing_ads.source import SourceBingAds + +from airbyte_cdk.models import ConfiguredAirbyteCatalog, SyncMode +from airbyte_cdk.test.catalog_builder import CatalogBuilder +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read + + +def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Optional[Dict[str, Any]]) -> SourceBingAds: + return SourceBingAds(catalog=catalog, config=config, state=state) + + +def read_helper( + config: Dict[str, Any], + catalog: ConfiguredAirbyteCatalog, + state: Optional[Dict[str, Any]] = None, + expecting_exception: bool = False, +) -> EntrypointOutput: + source = _source(catalog=catalog, config=config, state={}) + return read(source, config, catalog, state, expecting_exception) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 1004fc6482f5..392105afe830 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -25,7 +25,7 @@ def read_stream( ) -> Tuple[EntrypointOutput, MagicMock]: with patch.object(HttpAuthenticated, "send", mock_http_authenticated_send): catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() - return read(SourceBingAds(), config, catalog, state, expecting_exception) + return read(SourceBingAds, config, catalog, state, expecting_exception) def test_read_accounts_tax_certificate_data(self): # Our account doesn't have configured Tax certificate. From cf70e38f818c49ed9b25b3fb5e108c3ebec6669a Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 28 Apr 2025 16:34:25 -0700 Subject: [PATCH 09/31] mlc: make most of unit test pass with source helpers --- .../connectors/source-bing-ads/poetry.lock | 2 +- .../source-bing-ads/unit_tests/helpers.py | 17 +++++++++++++ .../test_app_install_ad_labels_stream.py | 2 +- .../test_app_install_ads_stream.py | 2 +- .../integrations/test_budget_stream.py | 2 +- .../unit_tests/test_reports.py | 12 +++++----- .../source-bing-ads/unit_tests/test_source.py | 24 +++++++++---------- 7 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py diff --git a/airbyte-integrations/connectors/source-bing-ads/poetry.lock b/airbyte-integrations/connectors/source-bing-ads/poetry.lock index f128bab03883..0f2a167641e7 100644 --- a/airbyte-integrations/connectors/source-bing-ads/poetry.lock +++ b/airbyte-integrations/connectors/source-bing-ads/poetry.lock @@ -2643,4 +2643,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12" -content-hash = "a72f4c5881ac18da12ff060cf93d769b0a745b1b2799e3a6216e00f16231c171" +content-hash = "eb326fac6ee6f9acf3dcc6031b12edc95d845eec49d042e875785eedb64a2973" diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py new file mode 100644 index 000000000000..2ca447cef52c --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py @@ -0,0 +1,17 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + + +from typing import Any, Dict, Optional + +from source_bing_ads.source import SourceBingAds + +from airbyte_cdk.models import ConfiguredAirbyteCatalog, SyncMode +from airbyte_cdk.test.catalog_builder import CatalogBuilder +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read + +def source(config: Dict[str, Any]=None, catalog: ConfiguredAirbyteCatalog=None, state: Optional[Dict[str, Any]] = None) -> SourceBingAds: + if not catalog: + catalog = CatalogBuilder().with_stream("fake_stream", SyncMode.full_refresh).build() + return SourceBingAds(catalog=catalog, config=config, state=state) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py index 483ab10e8581..b38ddde4f63a 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py @@ -18,7 +18,7 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels_empty") assert len(output.records) == 0 - assert len(output.logs) == 11 + assert len(output.logs) == 12 def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels") diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py index babd027ae9a0..a48a238d533f 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py @@ -18,7 +18,7 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads_empty") assert len(output.records) == 0 - assert len(output.logs) == 11 + assert len(output.logs) == 12 def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads") diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py index a784c19b1928..ed1b266a5c84 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py @@ -18,7 +18,7 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget_empty") assert len(output.records) == 0 - assert len(output.logs) == 11 + assert len(output.logs) == 12 def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget") diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py index aad542afec40..998e444d58a5 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py @@ -53,7 +53,7 @@ from suds import WebFault from airbyte_cdk.models import SyncMode - +from helpers import source TEST_CONFIG = { "developer_token": "developer_token", @@ -269,7 +269,7 @@ def test_report_parse_response_csv_error(caplog): @patch.object(source_bing_ads.source, "Client") def test_custom_report_clear_namespace(mocked_client, config_with_custom_reports, logger_mock): - custom_report = SourceBingAds().get_custom_reports(config_with_custom_reports, mocked_client)[0] + custom_report = source(config_with_custom_reports).get_custom_reports(config_with_custom_reports, mocked_client)[0] assert custom_report._clear_namespace("tns:ReportAggregation") == "ReportAggregation" @@ -280,7 +280,7 @@ def test_custom_report_get_object_columns(mocked_client, config_with_custom_repo mocked_client.get_service.return_value = reporting_service_mock mocked_client.environment = "production" - custom_report = SourceBingAds().get_custom_reports(config_with_custom_reports, mocked_client)[0] + custom_report = source(config=config_with_custom_reports).get_custom_reports(config_with_custom_reports, mocked_client)[0] tree = ET.parse(urlparse(SERVICE_INFO_DICT_V13[("reporting", mocked_client.environment)]).path) request_object = tree.find(f".//{{*}}complexType[@name='{custom_report.report_name}Request']") @@ -350,7 +350,7 @@ def test_custom_report_send_request(mocked_client, config_with_custom_reports, l class Fault: faultstring = "Invalid Client Data" - custom_report = SourceBingAds().get_custom_reports(config_with_custom_reports, mocked_client)[0] + custom_report = source(config=config_with_custom_reports).get_custom_reports(config_with_custom_reports, mocked_client)[0] with patch.object(BingAdsReportingServiceStream, "send_request", side_effect=WebFault(fault=Fault(), document=None)): custom_report.send_request(params={}, customer_id="13131313", account_id="800800808") assert ( @@ -396,7 +396,7 @@ class Fault: ) @patch.object(source_bing_ads.source, "Client") def test_custom_report_get_report_record_timestamp(mocked_client, config_with_custom_reports, aggregation, datastring, expected): - custom_report = SourceBingAds().get_custom_reports(config_with_custom_reports, mocked_client)[0] + custom_report = source(config=config_with_custom_reports).get_custom_reports(config_with_custom_reports, mocked_client)[0] custom_report.report_aggregation = aggregation assert custom_report.get_report_record_timestamp(datastring) == expected @@ -435,7 +435,7 @@ def test_account_performance_report_monthly_stream_slices_no_time_period(mocked_ @patch.object(source_bing_ads.source, "Client") def test_custom_performance_report_no_last_year_stream_slices(mocked_client, config_with_custom_reports, aggregation): mocked_client.reports_start_date = None # in case of start date time period won't be used in request params - custom_report = SourceBingAds().get_custom_reports(config_with_custom_reports, mocked_client)[0] + custom_report = source(config=config_with_custom_reports).get_custom_reports(config_with_custom_reports, mocked_client)[0] custom_report.report_aggregation = aggregation accounts_read_records = iter([{"Id": 180519267, "ParentCustomerId": 100}, {"Id": 180278106, "ParentCustomerId": 200}]) with patch.object(Accounts, "read_records", return_value=accounts_read_records): diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py index 25f77d8d279b..fcc593865074 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py @@ -8,28 +8,28 @@ import source_bing_ads from bingads.service_info import SERVICE_INFO_DICT_V13 from source_bing_ads.base_streams import Accounts, AdGroups, Ads, Campaigns -from source_bing_ads.source import SourceBingAds from airbyte_cdk.models import SyncMode from airbyte_cdk.utils import AirbyteTracedException +from helpers import source @patch.object(source_bing_ads.source, "Client") def test_streams_config_based(mocked_client, config): - streams = SourceBingAds().streams(config) - assert len(streams) == 77 + streams = source(config).streams(config) + assert len(streams) == 78 @patch.object(source_bing_ads.source, "Client") def test_source_check_connection_ok(mocked_client, config, logger_mock): with patch.object(Accounts, "read_records", return_value=iter([{"Id": 180519267}, {"Id": 180278106}])): - assert SourceBingAds().check_connection(logger_mock, config=config) == (True, None) + assert source(config).check_connection(logger_mock, config=config) == (True, None) @patch.object(source_bing_ads.source, "Client") def test_source_check_connection_failed_user_do_not_have_accounts(mocked_client, config, logger_mock): with patch.object(Accounts, "read_records", return_value=[]): - connected, reason = SourceBingAds().check_connection(logger_mock, config=config) + connected, reason = source(config).check_connection(logger_mock, config=config) assert connected is False assert ( reason.message == "Config validation error: You don't have accounts assigned to this user. Please verify your developer token." @@ -38,7 +38,7 @@ def test_source_check_connection_failed_user_do_not_have_accounts(mocked_client, def test_source_check_connection_failed_invalid_creds(config, logger_mock): with patch.object(Accounts, "read_records", return_value=[]): - connected, reason = SourceBingAds().check_connection(logger_mock, config=config) + connected, reason = source(config).check_connection(logger_mock, config=config) assert connected is False @@ -48,7 +48,7 @@ def test_validate_custom_reposts(mocked_client, config_with_custom_reports, logg reporting_service_mock._get_service_info_dict.return_value = SERVICE_INFO_DICT_V13 mocked_client.get_service.return_value = reporting_service_mock mocked_client.environment = "production" - res = SourceBingAds().validate_custom_reposts(config=config_with_custom_reports, client=mocked_client) + res = source(config_with_custom_reports).validate_custom_reposts(config=config_with_custom_reports, client=mocked_client) assert res is None @@ -61,7 +61,7 @@ def test_validate_custom_reposts_failed_invalid_report_columns(mocked_client, co config_with_custom_reports["custom_reports"][0]["report_columns"] = ["TimePeriod", "NonExistingColumn", "ConversionRate"] with pytest.raises(AirbyteTracedException) as e: - SourceBingAds().validate_custom_reposts(config=config_with_custom_reports, client=mocked_client) + source(config_with_custom_reports).validate_custom_reposts(config=config_with_custom_reports, client=mocked_client) assert e.value.internal_message == ( "my test custom report: Reporting Columns are invalid. " "Columns that you provided don't belong to Reporting Data Object Columns:" @@ -78,7 +78,7 @@ def test_validate_custom_reposts_failed_invalid_report_columns(mocked_client, co @patch.object(source_bing_ads.source, "Client") def test_get_custom_reports(mocked_client, config_with_custom_reports): - custom_reports = SourceBingAds().get_custom_reports(config_with_custom_reports, mocked_client) + custom_reports = source(config_with_custom_reports).get_custom_reports(config_with_custom_reports, mocked_client) assert isinstance(custom_reports, list) assert custom_reports[0].report_name == "DSAAutoTargetPerformanceReport" assert custom_reports[0].report_aggregation == "Weekly" @@ -86,9 +86,9 @@ def test_get_custom_reports(mocked_client, config_with_custom_reports): def test_clear_reporting_object_name(): - reporting_object = SourceBingAds()._clear_reporting_object_name("DSAAutoTargetPerformanceReportRequest") + reporting_object = source(config={})._clear_reporting_object_name("DSAAutoTargetPerformanceReportRequest") assert reporting_object == "DSAAutoTargetPerformanceReport" - reporting_object = SourceBingAds()._clear_reporting_object_name("DSAAutoTargetPerformanceReport") + reporting_object = source(config={})._clear_reporting_object_name("DSAAutoTargetPerformanceReport") assert reporting_object == "DSAAutoTargetPerformanceReport" @@ -210,4 +210,4 @@ def test_transform(mocked_client, config): @patch.object(source_bing_ads.source, "Client") def test_check_connection_with_accounts_names_config(mocked_client, config_with_account_names, logger_mock): with patch.object(Accounts, "read_records", return_value=iter([{"Id": 180519267}, {"Id": 180278106}])): - assert SourceBingAds().check_connection(logger_mock, config=config_with_account_names) == (True, None) + assert source(config=config_with_account_names).check_connection(logger_mock, config=config_with_account_names) == (True, None) From ea058176b7f2b6a45aaf82e6aa5feb722dec75a6 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 28 Apr 2025 16:35:19 -0700 Subject: [PATCH 10/31] mlc: ruff format --- .../connectors/source-bing-ads/unit_tests/helpers.py | 5 ++++- .../source-bing-ads/unit_tests/integrations/base_test.py | 3 ++- .../connectors/source-bing-ads/unit_tests/test_reports.py | 3 ++- .../connectors/source-bing-ads/unit_tests/test_source.py | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py index 2ca447cef52c..2e9de7454f72 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/helpers.py @@ -11,7 +11,10 @@ from airbyte_cdk.test.catalog_builder import CatalogBuilder from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read -def source(config: Dict[str, Any]=None, catalog: ConfiguredAirbyteCatalog=None, state: Optional[Dict[str, Any]] = None) -> SourceBingAds: + +def source( + config: Dict[str, Any] = None, catalog: ConfiguredAirbyteCatalog = None, state: Optional[Dict[str, Any]] = None +) -> SourceBingAds: if not catalog: catalog = CatalogBuilder().with_stream("fake_stream", SyncMode.full_refresh).build() return SourceBingAds(catalog=catalog, config=config, state=state) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index 03067d9c8954..d422199c20c5 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -9,6 +9,7 @@ from bingads.v13.reporting.reporting_service_manager import ReportingServiceManager from client_builder import build_request, response_with_status from config_builder import ConfigBuilder +from protocol_helpers import read_helper from source_bing_ads.source import SourceBingAds from suds.transport.https import HttpAuthenticated from suds_response_mock import mock_http_authenticated_send @@ -18,7 +19,7 @@ from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read from airbyte_cdk.test.mock_http import HttpMocker from airbyte_cdk.test.state_builder import StateBuilder -from protocol_helpers import read_helper + class BaseTest(TestCase): def setUp(self) -> None: diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py index 998e444d58a5..c8f8619f69cd 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_reports.py @@ -16,6 +16,7 @@ from bingads.service_info import SERVICE_INFO_DICT_V13 from bingads.v13.internal.reporting.row_report import _RowReport from bingads.v13.internal.reporting.row_report_iterator import _RowReportRecord, _RowValues +from helpers import source from source_bing_ads.base_streams import Accounts from source_bing_ads.report_streams import ( AccountImpressionPerformanceReportDaily, @@ -53,7 +54,7 @@ from suds import WebFault from airbyte_cdk.models import SyncMode -from helpers import source + TEST_CONFIG = { "developer_token": "developer_token", diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py index fcc593865074..f94ed3bad2b2 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py @@ -7,11 +7,11 @@ import pytest import source_bing_ads from bingads.service_info import SERVICE_INFO_DICT_V13 +from helpers import source from source_bing_ads.base_streams import Accounts, AdGroups, Ads, Campaigns from airbyte_cdk.models import SyncMode from airbyte_cdk.utils import AirbyteTracedException -from helpers import source @patch.object(source_bing_ads.source, "Client") From d52ea4ceab61c005a9c185ed1fde3dfad47a0bc8 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 28 Apr 2025 19:00:19 -0700 Subject: [PATCH 11/31] mlc: add unit test for accounts stream --- .../unit_tests/integrations/base_test.py | 7 +- .../unit_tests/integrations/client_builder.py | 19 ++ .../integrations/request_builder.py | 30 +++ .../integrations/test_accounts_stream.py | 26 ++- .../http/response/accounts_search.json | 173 ++++++++++++++++++ .../resource/http/response/user_query.json | 56 ++++++ 6 files changed, 307 insertions(+), 4 deletions(-) create mode 100644 airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py create mode 100644 airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json create mode 100644 airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index d422199c20c5..3db771d9884a 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -7,7 +7,7 @@ from bingads.v13.bulk import BulkServiceManager from bingads.v13.reporting.reporting_service_manager import ReportingServiceManager -from client_builder import build_request, response_with_status +from client_builder import build_request, build_request_2, response_with_status from config_builder import ConfigBuilder from protocol_helpers import read_helper from source_bing_ads.source import SourceBingAds @@ -50,6 +50,7 @@ def _state(self, file: str, stream_name: str) -> list[AirbyteStateMessage]: def _auth_client(self, http_mocker: HttpMocker) -> None: http_mocker.post(request=build_request(self._config), responses=response_with_status("oauth", 200)) + http_mocker.post(request=build_request_2(self._config), responses=response_with_status("oauth", 200)) def read_stream( self, @@ -67,3 +68,7 @@ def read_stream( catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() # return read(SourceBingAds(), config, catalog, state, expecting_exception), service_call_mock return read_helper(config, catalog, state, expecting_exception), service_call_mock + + @property + def http_mocker(self) -> HttpMocker: + return self._http_mocker diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py index 18036b1f0229..267e162a96a9 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py @@ -27,3 +27,22 @@ def build_request(config: Dict[str, Any]) -> HttpRequest: body=body, headers={"Content-Type": "application/x-www-form-urlencoded"}, ) + +def build_request_2(config: Dict[str, Any]) -> HttpRequest: + body = ( + "grant_type=refresh_token" + f"&client_id={config['client_id']}" + f"&client_secret={config['client_secret']}" + f"&refresh_token={config['refresh_token']}" + "&environment=production" + "&oauth_scope=msads.manage" + "&scope=https%3A%2F%2Fads.microsoft.com%2Fmsads.manage+offline_access" + f"&tenant={config['tenant_id']}" + ) # Remove the leading '&' for correct formatting + + return HttpRequest( + url="https://login.microsoftonline.com/common/oauth2/v2.0/token", + query_params={}, + body=body, + headers={"Content-Type": "application/x-www-form-urlencoded"}, + ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py new file mode 100644 index 000000000000..63dc60fb8bf5 --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py @@ -0,0 +1,30 @@ +# +# Copyright (c) 2025 Airbyte, Inc., all rights reserved. +# + +from __future__ import annotations +from typing import Union +from airbyte_cdk.test.mock_http.request import HttpRequest + + +CLIENT_CENTER_BASE_URL = "https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13" + + +class RequestBuilder: + def __init__(self, resource: str = None) -> None: + self._spreadsheet_id = None + self._query_params = {} + self._body = None + self.resource = resource + + def with_body(self, body: Union[str, bytes]): + self._body = body + return self + + def build(self) -> HttpRequest: + endpoint = f"/{self.resource}" if self.resource else "" + return HttpRequest( + url=f"{CLIENT_CENTER_BASE_URL}{endpoint}", + query_params=self._query_params, + body=self._body, + ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 392105afe830..809c2117d3e6 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -1,4 +1,5 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. +import json from typing import Any, Dict, Optional, Tuple from unittest.mock import MagicMock, patch @@ -10,7 +11,10 @@ from airbyte_cdk.models import SyncMode from airbyte_cdk.test.catalog_builder import CatalogBuilder from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read - +from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse +from airbyte_cdk.test.mock_http.response_builder import find_template +from protocol_helpers import read_helper +from request_builder import RequestBuilder class TestAccountsStream(BaseTest): stream_name = "accounts" @@ -20,14 +24,30 @@ def read_stream( stream_name: str, sync_mode: SyncMode, config: Dict[str, Any], + stream_data_file: Optional[str] = None, state: Optional[Dict[str, Any]] = None, expecting_exception: bool = False, - ) -> Tuple[EntrypointOutput, MagicMock]: + ) -> EntrypointOutput: with patch.object(HttpAuthenticated, "send", mock_http_authenticated_send): catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() - return read(SourceBingAds, config, catalog, state, expecting_exception) + return read_helper( + config=config, + catalog=catalog, + state=state, + expecting_exception=expecting_exception, + ) def test_read_accounts_tax_certificate_data(self): + http_mocker = self.http_mocker + http_mocker.post( + RequestBuilder(resource="User/Query").with_body('{"UserId": null}').build(), + HttpResponse(json.dumps(find_template("user_query", __file__)), 200), + ) + http_mocker.post( + RequestBuilder(resource="Accounts/Search").with_body(b'{"PageInfo": {"Index": 0, "Size": 1000}, "Predicates": [{"Field": "UserId", "Operator": "Equals", "Value": "123456789"}], "ReturnAdditionalFields": "TaxCertificate,AccountMode"}').build(), + HttpResponse(json.dumps(find_template("accounts_search", __file__)), 200), + ) + # Our account doesn't have configured Tax certificate. output = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config) assert output.records[0].record.data["TaxCertificate"] == { diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json new file mode 100644 index 000000000000..3aba4e0619da --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json @@ -0,0 +1,173 @@ +{ + "Accounts" : [ + { + "TaxCertificate": { + "Status": "Active", + "TaxCertificateBlobContainerName": "Test Container Name", + "TaxCertificates": [{"key": "test_key", "value": "test_value"}] + }, + "BillToCustomerId" : "987654321", + "CurrencyCode" : "USD", + "AccountFinancialStatus" : "Hold", + "Id" : "180278106", + "Language" : "English", + "LastModifiedByUserId" : "0", + "LastModifiedTime" : "2025-02-20T05:26:37.2", + "Name" : "Example Inc.", + "Number" : "EX123456", + "ParentCustomerId" : "987654321", + "PaymentMethodId" : "138188746", + "PaymentMethodType" : "CreditCard", + "PrimaryUserId" : "123456789", + "AccountLifeCycleStatus" : "Active", + "TimeStamp" : "AAAAAH1yyMo=", + "TimeZone" : "Arizona", + "PauseReason" : null, + "ForwardCompatibilityMap" : null, + "LinkedAgencies" : [], + "SalesHouseCustomerId" : null, + "TaxInformation" : [], + "BackUpPaymentInstrumentId" : null, + "BillingThresholdAmount" : null, + "BusinessAddress" : { + "City" : "San Francisco", + "CountryCode" : "US", + "Id" : "149004358", + "Line1" : "123 Example Street", + "Line2" : null, + "Line3" : null, + "Line4" : null, + "PostalCode" : "12345", + "StateOrProvince" : "CA", + "TimeStamp" : null, + "BusinessName" : "Fake Inc." + }, + "AutoTagType" : "Inactive", + "SoldToPaymentInstrumentId" : null, + "AccountMode" : "Expert" + }, + { + "BillToCustomerId" : "987654321", + "CurrencyCode" : "USD", + "AccountFinancialStatus" : "Hold", + "Id" : "180519267", + "Language" : "English", + "LastModifiedByUserId" : "3", + "LastModifiedTime" : "2024-04-18T01:38:27.893", + "Name" : "Fake", + "Number" : "F149MJ18", + "ParentCustomerId" : "987654321", + "PaymentMethodId" : "157014353", + "PaymentMethodType" : "CreditCard", + "PrimaryUserId" : "123456789", + "AccountLifeCycleStatus" : "Active", + "TimeStamp" : "AAAAAIcQrSU=", + "TimeZone" : "CentralTimeUSCanada", + "PauseReason" : null, + "ForwardCompatibilityMap" : null, + "LinkedAgencies" : [], + "SalesHouseCustomerId" : null, + "TaxInformation" : [], + "BackUpPaymentInstrumentId" : null, + "BillingThresholdAmount" : null, + "BusinessAddress" : { + "City" : "San Francisco", + "CountryCode" : "US", + "Id" : "149649761", + "Line1" : "456 Sample Ave", + "Line2" : null, + "Line3" : null, + "Line4" : null, + "PostalCode" : "67890", + "StateOrProvince" : "CA", + "TimeStamp" : null, + "BusinessName" : "Fake" + }, + "AutoTagType" : "Preserve", + "SoldToPaymentInstrumentId" : null, + "AccountMode" : "Expert" + }, + { + "BillToCustomerId" : "987654321", + "CurrencyCode" : "USD", + "AccountFinancialStatus" : "ClearFinancialStatus", + "Id" : "180535609", + "Language" : "English", + "LastModifiedByUserId" : "0", + "LastModifiedTime" : "2023-08-11T08:24:26.603", + "Name" : "DEMO-ACCOUNT", + "Number" : "F149W3B6", + "ParentCustomerId" : "987654321", + "PaymentMethodId" : null, + "PaymentMethodType" : null, + "PrimaryUserId" : "123456789", + "AccountLifeCycleStatus" : "Pause", + "TimeStamp" : "AAAAAH10c1A=", + "TimeZone" : "Santiago", + "PauseReason" : 2, + "ForwardCompatibilityMap" : null, + "LinkedAgencies" : [], + "SalesHouseCustomerId" : null, + "TaxInformation" : [], + "BackUpPaymentInstrumentId" : null, + "BillingThresholdAmount" : null, + "BusinessAddress" : { + "City" : "San Pancho", + "CountryCode" : "US", + "Id" : "149694999", + "Line1" : "789 Test Blvd", + "Line2" : null, + "Line3" : null, + "Line4" : null, + "PostalCode" : "54321", + "StateOrProvince" : "CA", + "TimeStamp" : null, + "BusinessName" : "Fake Inc." + }, + "AutoTagType" : "Inactive", + "SoldToPaymentInstrumentId" : null, + "AccountMode" : "Expert" + }, + { + "BillToCustomerId" : "987654321", + "CurrencyCode" : "USD", + "AccountFinancialStatus" : "ClearFinancialStatus", + "Id" : "180767304", + "Language" : "English", + "LastModifiedByUserId" : "123456789", + "LastModifiedTime" : "2025-04-10T17:52:22.877", + "Name" : "Test Manager Account", + "Number" : "F332JDYP", + "ParentCustomerId" : "987654321", + "PaymentMethodId" : null, + "PaymentMethodType" : null, + "PrimaryUserId" : "123456789", + "AccountLifeCycleStatus" : "Pending", + "TimeStamp" : "AAAAAJNgyw4=", + "TimeZone" : "PacificTimeUSCanadaTijuana", + "PauseReason" : null, + "ForwardCompatibilityMap" : null, + "LinkedAgencies" : [], + "SalesHouseCustomerId" : null, + "TaxInformation" : [], + "BackUpPaymentInstrumentId" : null, + "BillingThresholdAmount" : null, + "BusinessAddress" : { + "City" : "San Pancho", + "CountryCode" : "US", + "Id" : "123456789", + "Line1" : "101 Fake Lane", + "Line2" : null, + "Line3" : null, + "Line4" : null, + "PostalCode" : "98765", + "StateOrProvince" : "CA", + "TimeStamp" : null, + "BusinessName" : "FakeBusiness Inc." + }, + "AutoTagType" : "Inactive", + "SoldToPaymentInstrumentId" : null, + "AccountMode" : "Expert" + } + ] +} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json new file mode 100644 index 000000000000..d5c21374c66a --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json @@ -0,0 +1,56 @@ +{ + "User" : { + "ContactInfo" : { + "Address" : { + "City" : "San Pancho", + "CountryCode" : "US", + "Id" : "202200652", + "Line1" : "2261 Fake Street, #1234", + "Line2" : "4381", + "Line3" : null, + "Line4" : null, + "PostalCode" : "94114", + "StateOrProvince" : "CA", + "TimeStamp" : "AAAAAIEIynM=", + "BusinessName" : null + }, + "ContactByPhone" : false, + "ContactByPostalMail" : false, + "Email" : "user@domain.com", + "EmailFormat" : null, + "Fax" : null, + "HomePhone" : null, + "Id" : "138440787", + "Mobile" : null, + "Phone1" : "8665156175", + "Phone2" : null + }, + "CustomerId" : "987654321", + "Id" : "123456789", + "JobTitle" : null, + "LastModifiedByUserId" : "123456789", + "LastModifiedTime" : "2025-04-14T15:30:21.223", + "Lcid" : "EnglishUS", + "Name" : { + "FirstName" : "Fake", + "LastName" : "Name", + "MiddleInitial" : null + }, + "Password" : null, + "SecretAnswer" : null, + "SecretQuestion" : "None", + "UserLifeCycleStatus" : "Active", + "TimeStamp" : "AAAAAJOAurw=", + "UserName" : "fake-test@fomain.io", + "ForwardCompatibilityMap" : null + }, + "CustomerRoles" : [ + { + "RoleId" : 41, + "CustomerId" : "987654321", + "AccountIds" : null, + "LinkedAccountIds" : null, + "CustomerLinkPermission" : null + } + ] +} \ No newline at end of file From e17391919db81b28b8cb729950ba3415665f50dd Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 28 Apr 2025 19:01:19 -0700 Subject: [PATCH 12/31] mlc: ruff format --- .../unit_tests/integrations/client_builder.py | 1 + .../integrations/request_builder.py | 2 + .../integrations/test_accounts_stream.py | 11 +- .../http/response/accounts_search.json | 312 +++++++++--------- .../resource/http/response/user_query.json | 96 +++--- 5 files changed, 215 insertions(+), 207 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py index 267e162a96a9..fc06604dfb9b 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py @@ -28,6 +28,7 @@ def build_request(config: Dict[str, Any]) -> HttpRequest: headers={"Content-Type": "application/x-www-form-urlencoded"}, ) + def build_request_2(config: Dict[str, Any]) -> HttpRequest: body = ( "grant_type=refresh_token" diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py index 63dc60fb8bf5..310642824a58 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py @@ -3,7 +3,9 @@ # from __future__ import annotations + from typing import Union + from airbyte_cdk.test.mock_http.request import HttpRequest diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 809c2117d3e6..7f35b1015210 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -4,6 +4,8 @@ from unittest.mock import MagicMock, patch from base_test import BaseTest +from protocol_helpers import read_helper +from request_builder import RequestBuilder from source_bing_ads.source import SourceBingAds from suds.transport.https import HttpAuthenticated from suds_response_mock import mock_http_authenticated_send @@ -13,8 +15,7 @@ from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read from airbyte_cdk.test.mock_http import HttpMocker, HttpResponse from airbyte_cdk.test.mock_http.response_builder import find_template -from protocol_helpers import read_helper -from request_builder import RequestBuilder + class TestAccountsStream(BaseTest): stream_name = "accounts" @@ -44,7 +45,11 @@ def test_read_accounts_tax_certificate_data(self): HttpResponse(json.dumps(find_template("user_query", __file__)), 200), ) http_mocker.post( - RequestBuilder(resource="Accounts/Search").with_body(b'{"PageInfo": {"Index": 0, "Size": 1000}, "Predicates": [{"Field": "UserId", "Operator": "Equals", "Value": "123456789"}], "ReturnAdditionalFields": "TaxCertificate,AccountMode"}').build(), + RequestBuilder(resource="Accounts/Search") + .with_body( + b'{"PageInfo": {"Index": 0, "Size": 1000}, "Predicates": [{"Field": "UserId", "Operator": "Equals", "Value": "123456789"}], "ReturnAdditionalFields": "TaxCertificate,AccountMode"}' + ) + .build(), HttpResponse(json.dumps(find_template("accounts_search", __file__)), 200), ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json index 3aba4e0619da..2ebb0d8d75af 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search.json @@ -1,173 +1,173 @@ { - "Accounts" : [ + "Accounts": [ { "TaxCertificate": { "Status": "Active", - "TaxCertificateBlobContainerName": "Test Container Name", - "TaxCertificates": [{"key": "test_key", "value": "test_value"}] + "TaxCertificateBlobContainerName": "Test Container Name", + "TaxCertificates": [{ "key": "test_key", "value": "test_value" }] }, - "BillToCustomerId" : "987654321", - "CurrencyCode" : "USD", - "AccountFinancialStatus" : "Hold", - "Id" : "180278106", - "Language" : "English", - "LastModifiedByUserId" : "0", - "LastModifiedTime" : "2025-02-20T05:26:37.2", - "Name" : "Example Inc.", - "Number" : "EX123456", - "ParentCustomerId" : "987654321", - "PaymentMethodId" : "138188746", - "PaymentMethodType" : "CreditCard", - "PrimaryUserId" : "123456789", - "AccountLifeCycleStatus" : "Active", - "TimeStamp" : "AAAAAH1yyMo=", - "TimeZone" : "Arizona", - "PauseReason" : null, - "ForwardCompatibilityMap" : null, - "LinkedAgencies" : [], - "SalesHouseCustomerId" : null, - "TaxInformation" : [], - "BackUpPaymentInstrumentId" : null, - "BillingThresholdAmount" : null, - "BusinessAddress" : { - "City" : "San Francisco", - "CountryCode" : "US", - "Id" : "149004358", - "Line1" : "123 Example Street", - "Line2" : null, - "Line3" : null, - "Line4" : null, - "PostalCode" : "12345", - "StateOrProvince" : "CA", - "TimeStamp" : null, - "BusinessName" : "Fake Inc." + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "Hold", + "Id": "180278106", + "Language": "English", + "LastModifiedByUserId": "0", + "LastModifiedTime": "2025-02-20T05:26:37.2", + "Name": "Example Inc.", + "Number": "EX123456", + "ParentCustomerId": "987654321", + "PaymentMethodId": "138188746", + "PaymentMethodType": "CreditCard", + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Active", + "TimeStamp": "AAAAAH1yyMo=", + "TimeZone": "Arizona", + "PauseReason": null, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Francisco", + "CountryCode": "US", + "Id": "149004358", + "Line1": "123 Example Street", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "12345", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "Fake Inc." }, - "AutoTagType" : "Inactive", - "SoldToPaymentInstrumentId" : null, - "AccountMode" : "Expert" + "AutoTagType": "Inactive", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" }, { - "BillToCustomerId" : "987654321", - "CurrencyCode" : "USD", - "AccountFinancialStatus" : "Hold", - "Id" : "180519267", - "Language" : "English", - "LastModifiedByUserId" : "3", - "LastModifiedTime" : "2024-04-18T01:38:27.893", - "Name" : "Fake", - "Number" : "F149MJ18", - "ParentCustomerId" : "987654321", - "PaymentMethodId" : "157014353", - "PaymentMethodType" : "CreditCard", - "PrimaryUserId" : "123456789", - "AccountLifeCycleStatus" : "Active", - "TimeStamp" : "AAAAAIcQrSU=", - "TimeZone" : "CentralTimeUSCanada", - "PauseReason" : null, - "ForwardCompatibilityMap" : null, - "LinkedAgencies" : [], - "SalesHouseCustomerId" : null, - "TaxInformation" : [], - "BackUpPaymentInstrumentId" : null, - "BillingThresholdAmount" : null, - "BusinessAddress" : { - "City" : "San Francisco", - "CountryCode" : "US", - "Id" : "149649761", - "Line1" : "456 Sample Ave", - "Line2" : null, - "Line3" : null, - "Line4" : null, - "PostalCode" : "67890", - "StateOrProvince" : "CA", - "TimeStamp" : null, - "BusinessName" : "Fake" + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "Hold", + "Id": "180519267", + "Language": "English", + "LastModifiedByUserId": "3", + "LastModifiedTime": "2024-04-18T01:38:27.893", + "Name": "Fake", + "Number": "F149MJ18", + "ParentCustomerId": "987654321", + "PaymentMethodId": "157014353", + "PaymentMethodType": "CreditCard", + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Active", + "TimeStamp": "AAAAAIcQrSU=", + "TimeZone": "CentralTimeUSCanada", + "PauseReason": null, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Francisco", + "CountryCode": "US", + "Id": "149649761", + "Line1": "456 Sample Ave", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "67890", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "Fake" }, - "AutoTagType" : "Preserve", - "SoldToPaymentInstrumentId" : null, - "AccountMode" : "Expert" + "AutoTagType": "Preserve", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" }, { - "BillToCustomerId" : "987654321", - "CurrencyCode" : "USD", - "AccountFinancialStatus" : "ClearFinancialStatus", - "Id" : "180535609", - "Language" : "English", - "LastModifiedByUserId" : "0", - "LastModifiedTime" : "2023-08-11T08:24:26.603", - "Name" : "DEMO-ACCOUNT", - "Number" : "F149W3B6", - "ParentCustomerId" : "987654321", - "PaymentMethodId" : null, - "PaymentMethodType" : null, - "PrimaryUserId" : "123456789", - "AccountLifeCycleStatus" : "Pause", - "TimeStamp" : "AAAAAH10c1A=", - "TimeZone" : "Santiago", - "PauseReason" : 2, - "ForwardCompatibilityMap" : null, - "LinkedAgencies" : [], - "SalesHouseCustomerId" : null, - "TaxInformation" : [], - "BackUpPaymentInstrumentId" : null, - "BillingThresholdAmount" : null, - "BusinessAddress" : { - "City" : "San Pancho", - "CountryCode" : "US", - "Id" : "149694999", - "Line1" : "789 Test Blvd", - "Line2" : null, - "Line3" : null, - "Line4" : null, - "PostalCode" : "54321", - "StateOrProvince" : "CA", - "TimeStamp" : null, - "BusinessName" : "Fake Inc." + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "ClearFinancialStatus", + "Id": "180535609", + "Language": "English", + "LastModifiedByUserId": "0", + "LastModifiedTime": "2023-08-11T08:24:26.603", + "Name": "DEMO-ACCOUNT", + "Number": "F149W3B6", + "ParentCustomerId": "987654321", + "PaymentMethodId": null, + "PaymentMethodType": null, + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Pause", + "TimeStamp": "AAAAAH10c1A=", + "TimeZone": "Santiago", + "PauseReason": 2, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Pancho", + "CountryCode": "US", + "Id": "149694999", + "Line1": "789 Test Blvd", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "54321", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "Fake Inc." }, - "AutoTagType" : "Inactive", - "SoldToPaymentInstrumentId" : null, - "AccountMode" : "Expert" + "AutoTagType": "Inactive", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" }, { - "BillToCustomerId" : "987654321", - "CurrencyCode" : "USD", - "AccountFinancialStatus" : "ClearFinancialStatus", - "Id" : "180767304", - "Language" : "English", - "LastModifiedByUserId" : "123456789", - "LastModifiedTime" : "2025-04-10T17:52:22.877", - "Name" : "Test Manager Account", - "Number" : "F332JDYP", - "ParentCustomerId" : "987654321", - "PaymentMethodId" : null, - "PaymentMethodType" : null, - "PrimaryUserId" : "123456789", - "AccountLifeCycleStatus" : "Pending", - "TimeStamp" : "AAAAAJNgyw4=", - "TimeZone" : "PacificTimeUSCanadaTijuana", - "PauseReason" : null, - "ForwardCompatibilityMap" : null, - "LinkedAgencies" : [], - "SalesHouseCustomerId" : null, - "TaxInformation" : [], - "BackUpPaymentInstrumentId" : null, - "BillingThresholdAmount" : null, - "BusinessAddress" : { - "City" : "San Pancho", - "CountryCode" : "US", - "Id" : "123456789", - "Line1" : "101 Fake Lane", - "Line2" : null, - "Line3" : null, - "Line4" : null, - "PostalCode" : "98765", - "StateOrProvince" : "CA", - "TimeStamp" : null, - "BusinessName" : "FakeBusiness Inc." + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "ClearFinancialStatus", + "Id": "180767304", + "Language": "English", + "LastModifiedByUserId": "123456789", + "LastModifiedTime": "2025-04-10T17:52:22.877", + "Name": "Test Manager Account", + "Number": "F332JDYP", + "ParentCustomerId": "987654321", + "PaymentMethodId": null, + "PaymentMethodType": null, + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Pending", + "TimeStamp": "AAAAAJNgyw4=", + "TimeZone": "PacificTimeUSCanadaTijuana", + "PauseReason": null, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Pancho", + "CountryCode": "US", + "Id": "123456789", + "Line1": "101 Fake Lane", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "98765", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "FakeBusiness Inc." }, - "AutoTagType" : "Inactive", - "SoldToPaymentInstrumentId" : null, - "AccountMode" : "Expert" + "AutoTagType": "Inactive", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" } ] -} \ No newline at end of file +} diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json index d5c21374c66a..0386c18d4c94 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/user_query.json @@ -1,56 +1,56 @@ { - "User" : { - "ContactInfo" : { - "Address" : { - "City" : "San Pancho", - "CountryCode" : "US", - "Id" : "202200652", - "Line1" : "2261 Fake Street, #1234", - "Line2" : "4381", - "Line3" : null, - "Line4" : null, - "PostalCode" : "94114", - "StateOrProvince" : "CA", - "TimeStamp" : "AAAAAIEIynM=", - "BusinessName" : null + "User": { + "ContactInfo": { + "Address": { + "City": "San Pancho", + "CountryCode": "US", + "Id": "202200652", + "Line1": "2261 Fake Street, #1234", + "Line2": "4381", + "Line3": null, + "Line4": null, + "PostalCode": "94114", + "StateOrProvince": "CA", + "TimeStamp": "AAAAAIEIynM=", + "BusinessName": null }, - "ContactByPhone" : false, - "ContactByPostalMail" : false, - "Email" : "user@domain.com", - "EmailFormat" : null, - "Fax" : null, - "HomePhone" : null, - "Id" : "138440787", - "Mobile" : null, - "Phone1" : "8665156175", - "Phone2" : null + "ContactByPhone": false, + "ContactByPostalMail": false, + "Email": "user@domain.com", + "EmailFormat": null, + "Fax": null, + "HomePhone": null, + "Id": "138440787", + "Mobile": null, + "Phone1": "8665156175", + "Phone2": null }, - "CustomerId" : "987654321", - "Id" : "123456789", - "JobTitle" : null, - "LastModifiedByUserId" : "123456789", - "LastModifiedTime" : "2025-04-14T15:30:21.223", - "Lcid" : "EnglishUS", - "Name" : { - "FirstName" : "Fake", - "LastName" : "Name", - "MiddleInitial" : null + "CustomerId": "987654321", + "Id": "123456789", + "JobTitle": null, + "LastModifiedByUserId": "123456789", + "LastModifiedTime": "2025-04-14T15:30:21.223", + "Lcid": "EnglishUS", + "Name": { + "FirstName": "Fake", + "LastName": "Name", + "MiddleInitial": null }, - "Password" : null, - "SecretAnswer" : null, - "SecretQuestion" : "None", - "UserLifeCycleStatus" : "Active", - "TimeStamp" : "AAAAAJOAurw=", - "UserName" : "fake-test@fomain.io", - "ForwardCompatibilityMap" : null + "Password": null, + "SecretAnswer": null, + "SecretQuestion": "None", + "UserLifeCycleStatus": "Active", + "TimeStamp": "AAAAAJOAurw=", + "UserName": "fake-test@fomain.io", + "ForwardCompatibilityMap": null }, - "CustomerRoles" : [ + "CustomerRoles": [ { - "RoleId" : 41, - "CustomerId" : "987654321", - "AccountIds" : null, - "LinkedAccountIds" : null, - "CustomerLinkPermission" : null + "RoleId": 41, + "CustomerId": "987654321", + "AccountIds": null, + "LinkedAccountIds": null, + "CustomerLinkPermission": null } ] -} \ No newline at end of file +} From cba930436c2b8c68aa6d18354c4fce91e21cf432 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 07:39:54 -0700 Subject: [PATCH 13/31] poetry lock --- .../connectors/source-bing-ads/poetry.lock | 8 ++++---- .../connectors/source-bing-ads/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/poetry.lock b/airbyte-integrations/connectors/source-bing-ads/poetry.lock index 0f2a167641e7..dd3eb381027a 100644 --- a/airbyte-integrations/connectors/source-bing-ads/poetry.lock +++ b/airbyte-integrations/connectors/source-bing-ads/poetry.lock @@ -2,14 +2,14 @@ [[package]] name = "airbyte-cdk" -version = "6.47.2" +version = "6.48.2.post1.dev14733922675" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" groups = ["main"] files = [ - {file = "airbyte_cdk-6.47.2-py3-none-any.whl", hash = "sha256:26d700d83aa11aeaf5f1d8fa9e5f5aefa88db19a01b7d53dbb8792af13e16d75"}, - {file = "airbyte_cdk-6.47.2.tar.gz", hash = "sha256:cee58b156cc6b238ba5c806c7d462b62691392ec536edbbfb41f81c0d85492c8"}, + {file = "airbyte_cdk-6.48.2.post1.dev14733922675-py3-none-any.whl", hash = "sha256:726ba096e4fa22871f2d3e9330a01ff3b70940a977e40bdc3b5b3531deeefcdf"}, + {file = "airbyte_cdk-6.48.2.post1.dev14733922675.tar.gz", hash = "sha256:016399d6aa7724f305c7bb8c8640d71e9bfd35c864df5f0a4147c05a6b88138b"}, ] [package.dependencies] @@ -2643,4 +2643,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12" -content-hash = "eb326fac6ee6f9acf3dcc6031b12edc95d845eec49d042e875785eedb64a2973" +content-hash = "aaf4612335ace1a51e932e1fae259cfb18b9e01e33d3f3695a2182f3cd9ef16c" diff --git a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml index 805fbc08bd8e..dce339a9ba9a 100644 --- a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml +++ b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml @@ -19,7 +19,7 @@ include = "source_bing_ads" python = "^3.10,<3.12" bingads = "==13.0.18.1" urllib3 = "==1.26.18" -airbyte-cdk = "^6" +airbyte-cdk = "6.48.2.post1.dev14733922675" cached-property = "==1.5.2" pendulum = "<3.0.0" From a43c384f5e7275d84b32a39cd9aa36810dcfe2fc Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 10:44:37 -0700 Subject: [PATCH 14/31] remove unnecesary imports and patches --- .../integrations/protocol_helpers.py | 5 ++--- .../integrations/test_accounts_stream.py | 21 +++++++------------ 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py index 62ba5034cab1..863648abf137 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/protocol_helpers.py @@ -7,9 +7,8 @@ from source_bing_ads.source import SourceBingAds -from airbyte_cdk.models import ConfiguredAirbyteCatalog, SyncMode -from airbyte_cdk.test.catalog_builder import CatalogBuilder -from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, discover, read +from airbyte_cdk.models import ConfiguredAirbyteCatalog +from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read def _source(catalog: ConfiguredAirbyteCatalog, config: Dict[str, Any], state: Optional[Dict[str, Any]]) -> SourceBingAds: diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 7f35b1015210..61adbf3071d3 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -1,14 +1,10 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. import json -from typing import Any, Dict, Optional, Tuple -from unittest.mock import MagicMock, patch +from typing import Any, Dict, Optional from base_test import BaseTest from protocol_helpers import read_helper from request_builder import RequestBuilder -from source_bing_ads.source import SourceBingAds -from suds.transport.https import HttpAuthenticated -from suds_response_mock import mock_http_authenticated_send from airbyte_cdk.models import SyncMode from airbyte_cdk.test.catalog_builder import CatalogBuilder @@ -29,14 +25,13 @@ def read_stream( state: Optional[Dict[str, Any]] = None, expecting_exception: bool = False, ) -> EntrypointOutput: - with patch.object(HttpAuthenticated, "send", mock_http_authenticated_send): - catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() - return read_helper( - config=config, - catalog=catalog, - state=state, - expecting_exception=expecting_exception, - ) + catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() + return read_helper( + config=config, + catalog=catalog, + state=state, + expecting_exception=expecting_exception, + ) def test_read_accounts_tax_certificate_data(self): http_mocker = self.http_mocker From f6de83e2b2fbdcdc7a407727212eb9447b3f14b1 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 11:08:01 -0700 Subject: [PATCH 15/31] cleanup and documment --- .../source-bing-ads/source_bing_ads/manifest.yaml | 1 - .../source-bing-ads/unit_tests/integrations/base_test.py | 1 - .../unit_tests/integrations/client_builder.py | 9 ++++++++- .../unit_tests/integrations/request_builder.py | 1 - .../connectors/source-bing-ads/unit_tests/test_source.py | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 0048ea431575..86d9bf098680 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -96,7 +96,6 @@ definitions: schema_normalization: Default streams: - - $ref: "#/definitions/users_stream" - $ref: "#/definitions/accounts_stream" concurrency_level: diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index 3db771d9884a..f1c5f1ea9caf 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -66,7 +66,6 @@ def read_stream( self.service_manager, "download_file", return_value=self._download_file(stream_data_file) ) as service_call_mock: catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build() - # return read(SourceBingAds(), config, catalog, state, expecting_exception), service_call_mock return read_helper(config, catalog, state, expecting_exception), service_call_mock @property diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py index fc06604dfb9b..da7f2773e0c6 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/client_builder.py @@ -30,6 +30,13 @@ def build_request(config: Dict[str, Any]) -> HttpRequest: def build_request_2(config: Dict[str, Any]) -> HttpRequest: + """ + This function is used to build a request for refreshing the OAuth token. + We should just have temporarily having a second request builder as we are maintaining the client + one and the declarative requester one. Once the client one is removed, the extra function can be removed as well. + And probably the integration test will yell by then. + The diff between the two is the order of the query parameters in the body. + """ body = ( "grant_type=refresh_token" f"&client_id={config['client_id']}" @@ -39,7 +46,7 @@ def build_request_2(config: Dict[str, Any]) -> HttpRequest: "&oauth_scope=msads.manage" "&scope=https%3A%2F%2Fads.microsoft.com%2Fmsads.manage+offline_access" f"&tenant={config['tenant_id']}" - ) # Remove the leading '&' for correct formatting + ) return HttpRequest( url="https://login.microsoftonline.com/common/oauth2/v2.0/token", diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py index 310642824a58..8170aa31e04e 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/request_builder.py @@ -14,7 +14,6 @@ class RequestBuilder: def __init__(self, resource: str = None) -> None: - self._spreadsheet_id = None self._query_params = {} self._body = None self.resource = resource diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py index f94ed3bad2b2..fe5b762fdfe2 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/test_source.py @@ -17,7 +17,7 @@ @patch.object(source_bing_ads.source, "Client") def test_streams_config_based(mocked_client, config): streams = source(config).streams(config) - assert len(streams) == 78 + assert len(streams) == 77 @patch.object(source_bing_ads.source, "Client") From 9d31c8362bf298d7fc13536574606e163554f523 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 12:01:39 -0700 Subject: [PATCH 16/31] change count of logs with checking specific empty data logs in output.logs --- .../unit_tests/integrations/base_test.py | 13 +++++++++++-- .../test_app_install_ad_labels_stream.py | 5 ++++- .../integrations/test_app_install_ads_stream.py | 5 ++++- .../unit_tests/integrations/test_budget_stream.py | 5 ++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index f1c5f1ea9caf..91b3f6743caf 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -10,11 +10,10 @@ from client_builder import build_request, build_request_2, response_with_status from config_builder import ConfigBuilder from protocol_helpers import read_helper -from source_bing_ads.source import SourceBingAds from suds.transport.https import HttpAuthenticated from suds_response_mock import mock_http_authenticated_send -from airbyte_cdk.models import AirbyteStateMessage, SyncMode +from airbyte_cdk.models import AirbyteStateMessage, SyncMode, AirbyteMessage, Type, AirbyteLogMessage, Level from airbyte_cdk.test.catalog_builder import CatalogBuilder from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read from airbyte_cdk.test.mock_http import HttpMocker @@ -71,3 +70,13 @@ def read_stream( @property def http_mocker(self) -> HttpMocker: return self._http_mocker + + @staticmethod + def create_log_message(log_message = ""): + return AirbyteMessage( + type=Type.LOG, + log=AirbyteLogMessage( + level=Level.INFO, + message=log_message, + ) + ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py index b38ddde4f63a..2f8b634eacea 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py @@ -18,7 +18,10 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels_empty") assert len(output.records) == 0 - assert len(output.logs) == 12 + empty_data_message = self.create_log_message('Empty data received. No columns to parse from file') + no_records_message = self.create_log_message(f'Read 0 records from {self.stream_name} stream') + assert empty_data_message in output.logs + assert no_records_message in output.logs def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels") diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py index a48a238d533f..3910a6902e1e 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py @@ -18,7 +18,10 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads_empty") assert len(output.records) == 0 - assert len(output.logs) == 12 + empty_data_message = self.create_log_message('Empty data received. No columns to parse from file') + no_records_message = self.create_log_message(f'Read 0 records from {self.stream_name} stream') + assert empty_data_message in output.logs + assert no_records_message in output.logs def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads") diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py index ed1b266a5c84..10913eac8bd9 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py @@ -18,7 +18,10 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget_empty") assert len(output.records) == 0 - assert len(output.logs) == 12 + empty_data_message = self.create_log_message('Empty data received. No columns to parse from file') + no_records_message = self.create_log_message(f'Read 0 records from {self.stream_name} stream') + assert empty_data_message in output.logs + assert no_records_message in output.logs def test_transform_records(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget") From da29b5b50f1b5c3f7433385d6f916c428aa8f157 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 12:02:50 -0700 Subject: [PATCH 17/31] ruff format --- .../source-bing-ads/unit_tests/integrations/base_test.py | 6 +++--- .../integrations/test_app_install_ad_labels_stream.py | 4 ++-- .../unit_tests/integrations/test_app_install_ads_stream.py | 4 ++-- .../unit_tests/integrations/test_budget_stream.py | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py index 91b3f6743caf..3d190c8d36d5 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/base_test.py @@ -13,7 +13,7 @@ from suds.transport.https import HttpAuthenticated from suds_response_mock import mock_http_authenticated_send -from airbyte_cdk.models import AirbyteStateMessage, SyncMode, AirbyteMessage, Type, AirbyteLogMessage, Level +from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, AirbyteStateMessage, Level, SyncMode, Type from airbyte_cdk.test.catalog_builder import CatalogBuilder from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read from airbyte_cdk.test.mock_http import HttpMocker @@ -72,11 +72,11 @@ def http_mocker(self) -> HttpMocker: return self._http_mocker @staticmethod - def create_log_message(log_message = ""): + def create_log_message(log_message: str): return AirbyteMessage( type=Type.LOG, log=AirbyteLogMessage( level=Level.INFO, message=log_message, - ) + ), ) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py index 2f8b634eacea..58f435409c44 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ad_labels_stream.py @@ -18,8 +18,8 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ad_labels_empty") assert len(output.records) == 0 - empty_data_message = self.create_log_message('Empty data received. No columns to parse from file') - no_records_message = self.create_log_message(f'Read 0 records from {self.stream_name} stream') + empty_data_message = self.create_log_message("Empty data received. No columns to parse from file") + no_records_message = self.create_log_message(f"Read 0 records from {self.stream_name} stream") assert empty_data_message in output.logs assert no_records_message in output.logs diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py index 3910a6902e1e..9f3a61bd88c5 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_app_install_ads_stream.py @@ -18,8 +18,8 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "app_install_ads_empty") assert len(output.records) == 0 - empty_data_message = self.create_log_message('Empty data received. No columns to parse from file') - no_records_message = self.create_log_message(f'Read 0 records from {self.stream_name} stream') + empty_data_message = self.create_log_message("Empty data received. No columns to parse from file") + no_records_message = self.create_log_message(f"Read 0 records from {self.stream_name} stream") assert empty_data_message in output.logs assert no_records_message in output.logs diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py index 10913eac8bd9..98fe226facb9 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_budget_stream.py @@ -18,8 +18,8 @@ def test_return_records_from_given_csv_file(self): def test_return_logged_info_for_empty_csv_file(self): output, _ = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config, "budget_empty") assert len(output.records) == 0 - empty_data_message = self.create_log_message('Empty data received. No columns to parse from file') - no_records_message = self.create_log_message(f'Read 0 records from {self.stream_name} stream') + empty_data_message = self.create_log_message("Empty data received. No columns to parse from file") + no_records_message = self.create_log_message(f"Read 0 records from {self.stream_name} stream") assert empty_data_message in output.logs assert no_records_message in output.logs From a8a43ceced1c6688480a6ae33b8830fcdbf14b57 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 12:34:10 -0700 Subject: [PATCH 18/31] add cdk:low-code to tags --- airbyte-integrations/connectors/source-bing-ads/metadata.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml index 8227facaf5b1..bafa6bf942b5 100644 --- a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml @@ -63,7 +63,7 @@ data: supportLevel: certified tags: - language:python - - cdk:python + - cdk:low-code connectorTestSuitesOptions: - suite: liveTests testConnections: From 3239dbc9620a16d7c6463df267538ad373381104 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 16:56:48 -0700 Subject: [PATCH 19/31] remove comment of accounts stream --- .../connectors/source-bing-ads/source_bing_ads/source.py | 1 - 1 file changed, 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py index 429a9ec666e8..a5d70724fcb3 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/source.py @@ -155,7 +155,6 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: client = Client(**config) streams = [ - # Accounts(client, config), AdGroups(client, config), AdGroupLabels(client, config), AppInstallAds(client, config), From 701c2095049105306bb0c9cfef22d7c66c427a58 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 29 Apr 2025 17:25:36 -0700 Subject: [PATCH 20/31] move to inline schema --- .../source_bing_ads/manifest.yaml | 270 +++++++++++++++++- .../source_bing_ads/schemas/accounts.json | 22 +- 2 files changed, 266 insertions(+), 26 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 86d9bf098680..7b927a52843c 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -5,7 +5,7 @@ type: DeclarativeSource check: type: CheckStream stream_names: - - accounts + - accounts definitions: authenticator: @@ -15,7 +15,8 @@ definitions: oauth_scope: "msads.manage" scope: "https://ads.microsoft.com/msads.manage offline_access" tenant: "{{ config['tenant_id'] }}" - token_refresh_endpoint: 'https://login.microsoftonline.com/{{ config["tenant_id"] }}/oauth2/v2.0/token' + token_refresh_endpoint: 'https://login.microsoftonline.com/{{ config["tenant_id"] + }}/oauth2/v2.0/token' grant_type: refresh_token client_id: '{{ config["client_id"] }}' client_secret: '{{ config["client_secret"] }}' @@ -53,13 +54,256 @@ definitions: name: accounts primary_key: Id schema_loader: - type: JsonFileSchemaLoader + type: InlineSchemaLoader file_path: "./source_bing_ads/schemas/accounts.json" + schema: + $schema: http://json-schema.org/draft-07/schema# + type: object + properties: + Id: + description: ID of the account + type: + - 'null' + - integer + AccountFinancialStatus: + description: The financial status of the account + type: + - 'null' + - string + AccountLifeCycleStatus: + description: The life cycle status of the account + type: + - 'null' + - string + AutoTagType: + description: The type of auto-tagging + type: + - 'null' + - string + AccountMode: + description: The mode of the account + type: + - 'null' + - string + ForwardCompatibilityMap: + description: Map for forward compatibility + type: + - 'null' + - string + PaymentMethodType: + description: Type of the payment method + type: + - 'null' + - string + Language: + description: The language used in the account + type: + - 'null' + - string + LinkedAgencies: + description: The agencies linked to the account for management purposes. + type: + - 'null' + - object + properties: + Id: + description: ID of the linked agency + type: + - 'null' + - integer + Name: + description: Name of the linked agency + type: + - 'null' + - string + TaxInformation: + description: Tax information of the account + type: + - 'null' + - string + CurrencyCode: + description: The currency code used by the account + type: + - 'null' + - string + TimeZone: + description: The time zone of the account + type: + - 'null' + - string + BusinessAddress: + description: The business address associated with the account. + type: + - 'null' + - object + properties: + City: + description: The city of the business address + type: + - 'null' + - string + CountryCode: + description: The country code of the business address + type: + - 'null' + - string + Id: + description: ID of the business address + type: + - 'null' + - integer + Line1: + description: Address line 1 + type: + - 'null' + - string + Line2: + description: Address line 2 + type: + - 'null' + - string + Line3: + description: Address line 3 + type: + - 'null' + - string + Line4: + description: Address line 4 + type: + - 'null' + - string + PostalCode: + description: The postal code of the business address + type: + - 'null' + - string + StateOrProvince: + description: The state or province of the business address + type: + - 'null' + - string + TimeStamp: + description: Timestamp of the business address + type: + - 'null' + - string + BusinessName: + description: The business name + type: + - 'null' + - string + BackUpPaymentInstrumentId: + description: ID of the backup payment instrument + type: + - 'null' + - integer + BillingThresholdAmount: + description: The threshold amount for billing + type: + - 'null' + - number + BillToCustomerId: + description: Customer ID for billing + type: + - 'null' + - integer + LastModifiedByUserId: + description: ID of the user who last modified the account + type: + - 'null' + - integer + LastModifiedTime: + description: The date and time of the last modification + type: + - 'null' + - string + format: date-time + airbyte_type: timestamp_without_timezone + Name: + description: The name of the account + type: + - 'null' + - string + Number: + description: The account number + type: + - 'null' + - string + ParentCustomerId: + description: ID of the parent customer + type: + - 'null' + - integer + PauseReason: + description: Reason for pausing the account + type: + - 'null' + - integer + PaymentMethodId: + description: ID of the payment method + type: + - 'null' + - integer + PrimaryUserId: + description: ID of the primary user + type: + - 'null' + - integer + SalesHouseCustomerId: + description: Customer ID for sales house + type: + - 'null' + - integer + SoldToPaymentInstrumentId: + description: ID of the payment instrument for sales + type: + - 'null' + - integer + TimeStamp: + description: Timestamp of the account + type: + - 'null' + - string + TaxCertificate: + type: + - 'null' + - object + properties: + TaxCertificateBlobContainerName: + type: + - 'null' + - string + Status: + type: + - 'null' + - string + enum: + - Invalid + - Pending + - Valid + TaxCertificates: + type: + - 'null' + - array + items: + type: + - 'null' + - object + properties: + key: + type: + - 'null' + - string + value: + type: + - 'null' + - string retriever: type: SimpleRetriever requester: type: HttpRequester - url_base: https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13/Accounts/Search + url_base: + https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13/Accounts/Search http_method: POST request_headers: Content-Type: application/json @@ -69,9 +313,9 @@ definitions: Index: "{{ next_page_token.next_page_token }}" Size: 1000 Predicates: - - Field: UserId - Operator: Equals - Value: "'{{ stream_partition['user_id'] }}'" + - Field: UserId + Operator: Equals + Value: "'{{ stream_partition['user_id'] }}'" ReturnAdditionalFields: TaxCertificate,AccountMode authenticator: "#/definitions/authenticator" paginator: @@ -83,11 +327,11 @@ definitions: partition_router: type: SubstreamPartitionRouter parent_stream_configs: - - type: ParentStreamConfig - parent_key: Id - partition_field: user_id - stream: - $ref: "#/definitions/users_stream" + - type: ParentStreamConfig + parent_key: Id + partition_field: user_id + stream: + $ref: "#/definitions/users_stream" record_selector: type: RecordSelector extractor: @@ -96,7 +340,7 @@ definitions: schema_normalization: Default streams: - - $ref: "#/definitions/accounts_stream" +- $ref: "#/definitions/accounts_stream" concurrency_level: type: ConcurrencyLevel diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json index 8da35addacc8..666522a87287 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/accounts.json @@ -35,19 +35,15 @@ "type": ["null", "string"] }, "LinkedAgencies": { - "description": "The agencies linked to the account for management purposes.", - "type": ["null", "array"], - "items": { - "type": ["null", "object"], - "properties": { - "Id": { - "description": "ID of the linked agency", - "type": ["null", "integer"] - }, - "Name": { - "description": "Name of the linked agency", - "type": ["null", "string"] - } + "type": ["null", "object"], + "properties": { + "Id": { + "description": "ID of the linked agency", + "type": ["null", "integer"] + }, + "Name": { + "description": "Name of the linked agency", + "type": ["null", "string"] } } }, From 8d5f1094cb7ad3e6d41689cc54f7175c41deb201 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 30 Apr 2025 07:32:19 -0700 Subject: [PATCH 21/31] ruff format --- .../source_bing_ads/manifest.yaml | 220 +++++++++--------- 1 file changed, 110 insertions(+), 110 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 7b927a52843c..a5eb4569f49c 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -5,7 +5,7 @@ type: DeclarativeSource check: type: CheckStream stream_names: - - accounts + - accounts definitions: authenticator: @@ -15,7 +15,8 @@ definitions: oauth_scope: "msads.manage" scope: "https://ads.microsoft.com/msads.manage offline_access" tenant: "{{ config['tenant_id'] }}" - token_refresh_endpoint: 'https://login.microsoftonline.com/{{ config["tenant_id"] + token_refresh_endpoint: + 'https://login.microsoftonline.com/{{ config["tenant_id"] }}/oauth2/v2.0/token' grant_type: refresh_token client_id: '{{ config["client_id"] }}' @@ -63,247 +64,246 @@ definitions: Id: description: ID of the account type: - - 'null' - - integer + - "null" + - integer AccountFinancialStatus: description: The financial status of the account type: - - 'null' - - string + - "null" + - string AccountLifeCycleStatus: description: The life cycle status of the account type: - - 'null' - - string + - "null" + - string AutoTagType: description: The type of auto-tagging type: - - 'null' - - string + - "null" + - string AccountMode: description: The mode of the account type: - - 'null' - - string + - "null" + - string ForwardCompatibilityMap: description: Map for forward compatibility type: - - 'null' - - string + - "null" + - string PaymentMethodType: description: Type of the payment method type: - - 'null' - - string + - "null" + - string Language: description: The language used in the account type: - - 'null' - - string + - "null" + - string LinkedAgencies: description: The agencies linked to the account for management purposes. type: - - 'null' - - object + - "null" + - object properties: Id: description: ID of the linked agency type: - - 'null' - - integer + - "null" + - integer Name: description: Name of the linked agency type: - - 'null' - - string + - "null" + - string TaxInformation: description: Tax information of the account type: - - 'null' - - string + - "null" + - string CurrencyCode: description: The currency code used by the account type: - - 'null' - - string + - "null" + - string TimeZone: description: The time zone of the account type: - - 'null' - - string + - "null" + - string BusinessAddress: description: The business address associated with the account. type: - - 'null' - - object + - "null" + - object properties: City: description: The city of the business address type: - - 'null' - - string + - "null" + - string CountryCode: description: The country code of the business address type: - - 'null' - - string + - "null" + - string Id: description: ID of the business address type: - - 'null' - - integer + - "null" + - integer Line1: description: Address line 1 type: - - 'null' - - string + - "null" + - string Line2: description: Address line 2 type: - - 'null' - - string + - "null" + - string Line3: description: Address line 3 type: - - 'null' - - string + - "null" + - string Line4: description: Address line 4 type: - - 'null' - - string + - "null" + - string PostalCode: description: The postal code of the business address type: - - 'null' - - string + - "null" + - string StateOrProvince: description: The state or province of the business address type: - - 'null' - - string + - "null" + - string TimeStamp: description: Timestamp of the business address type: - - 'null' - - string + - "null" + - string BusinessName: description: The business name type: - - 'null' - - string + - "null" + - string BackUpPaymentInstrumentId: description: ID of the backup payment instrument type: - - 'null' - - integer + - "null" + - integer BillingThresholdAmount: description: The threshold amount for billing type: - - 'null' - - number + - "null" + - number BillToCustomerId: description: Customer ID for billing type: - - 'null' - - integer + - "null" + - integer LastModifiedByUserId: description: ID of the user who last modified the account type: - - 'null' - - integer + - "null" + - integer LastModifiedTime: description: The date and time of the last modification type: - - 'null' - - string + - "null" + - string format: date-time airbyte_type: timestamp_without_timezone Name: description: The name of the account type: - - 'null' - - string + - "null" + - string Number: description: The account number type: - - 'null' - - string + - "null" + - string ParentCustomerId: description: ID of the parent customer type: - - 'null' - - integer + - "null" + - integer PauseReason: description: Reason for pausing the account type: - - 'null' - - integer + - "null" + - integer PaymentMethodId: description: ID of the payment method type: - - 'null' - - integer + - "null" + - integer PrimaryUserId: description: ID of the primary user type: - - 'null' - - integer + - "null" + - integer SalesHouseCustomerId: description: Customer ID for sales house type: - - 'null' - - integer + - "null" + - integer SoldToPaymentInstrumentId: description: ID of the payment instrument for sales type: - - 'null' - - integer + - "null" + - integer TimeStamp: description: Timestamp of the account type: - - 'null' - - string + - "null" + - string TaxCertificate: type: - - 'null' - - object + - "null" + - object properties: TaxCertificateBlobContainerName: type: - - 'null' - - string + - "null" + - string Status: type: - - 'null' - - string + - "null" + - string enum: - - Invalid - - Pending - - Valid + - Invalid + - Pending + - Valid TaxCertificates: type: - - 'null' - - array + - "null" + - array items: type: - - 'null' - - object + - "null" + - object properties: key: type: - - 'null' - - string + - "null" + - string value: type: - - 'null' - - string + - "null" + - string retriever: type: SimpleRetriever requester: type: HttpRequester - url_base: - https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13/Accounts/Search + url_base: https://clientcenter.api.bingads.microsoft.com/CustomerManagement/v13/Accounts/Search http_method: POST request_headers: Content-Type: application/json @@ -313,9 +313,9 @@ definitions: Index: "{{ next_page_token.next_page_token }}" Size: 1000 Predicates: - - Field: UserId - Operator: Equals - Value: "'{{ stream_partition['user_id'] }}'" + - Field: UserId + Operator: Equals + Value: "'{{ stream_partition['user_id'] }}'" ReturnAdditionalFields: TaxCertificate,AccountMode authenticator: "#/definitions/authenticator" paginator: @@ -327,11 +327,11 @@ definitions: partition_router: type: SubstreamPartitionRouter parent_stream_configs: - - type: ParentStreamConfig - parent_key: Id - partition_field: user_id - stream: - $ref: "#/definitions/users_stream" + - type: ParentStreamConfig + parent_key: Id + partition_field: user_id + stream: + $ref: "#/definitions/users_stream" record_selector: type: RecordSelector extractor: @@ -340,7 +340,7 @@ definitions: schema_normalization: Default streams: -- $ref: "#/definitions/accounts_stream" + - $ref: "#/definitions/accounts_stream" concurrency_level: type: ConcurrencyLevel From d91ddb0cd9fdc86f403af9e36ecca0b7b7a7f428 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 30 Apr 2025 14:21:19 -0700 Subject: [PATCH 22/31] comment out disabled secret --- .../connectors/source-bing-ads/metadata.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml index bafa6bf942b5..1ff0b351e767 100644 --- a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml @@ -83,11 +83,12 @@ data: secretStore: type: GSM alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-BING-ADS_NO_DATE_CREDS - fileName: config_no_date.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store +# This one is currently disabled in GSM +# - name: SECRET_SOURCE-BING-ADS_NO_DATE_CREDS +# fileName: config_no_date.json +# secretStore: +# type: GSM +# alias: airbyte-connector-testing-secret-store - name: SECRET_SOURCE-BING-ADS_NO_START_DATE__CREDS fileName: config_no_date.json secretStore: From ad2d0f897f42476a1bc47fd2c1dbfe563b13cad8 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 30 Apr 2025 14:42:18 -0700 Subject: [PATCH 23/31] comment out disabled secret --- .../connectors/source-bing-ads/metadata.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml index 1ff0b351e767..bbc5d36ad059 100644 --- a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml @@ -83,12 +83,6 @@ data: secretStore: type: GSM alias: airbyte-connector-testing-secret-store -# This one is currently disabled in GSM -# - name: SECRET_SOURCE-BING-ADS_NO_DATE_CREDS -# fileName: config_no_date.json -# secretStore: -# type: GSM -# alias: airbyte-connector-testing-secret-store - name: SECRET_SOURCE-BING-ADS_NO_START_DATE__CREDS fileName: config_no_date.json secretStore: From e5eb1e51fbd36e162dab3072812621fdda53b5e5 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 30 Apr 2025 16:49:29 -0700 Subject: [PATCH 24/31] add transformation to keep previous schema --- .../source-bing-ads/source_bing_ads/manifest.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index a5eb4569f49c..73fd506c8af2 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -338,6 +338,13 @@ definitions: type: DpathExtractor field_path: ["Accounts"] schema_normalization: Default + transformations: + - type: AddFields + fields: + - type: AddedFieldDefinition + path: + - LinkedAgencies + value: "{{ { \"CustomerInfo\": record.LinkedAgencies } }}" streams: - $ref: "#/definitions/accounts_stream" From 7cf746b48112ff2b79a24dcb6f5d9f15f62126c2 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Wed, 30 Apr 2025 16:50:20 -0700 Subject: [PATCH 25/31] prettier yaml --- .../connectors/source-bing-ads/source_bing_ads/manifest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 73fd506c8af2..8967e50fe819 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -344,7 +344,7 @@ definitions: - type: AddedFieldDefinition path: - LinkedAgencies - value: "{{ { \"CustomerInfo\": record.LinkedAgencies } }}" + value: '{{ { "CustomerInfo": record.LinkedAgencies } }}' streams: - $ref: "#/definitions/accounts_stream" From 43149b1b2ee093a8a7dfba8db36b6c4f5ceba7ae Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 1 May 2025 07:47:06 -0700 Subject: [PATCH 26/31] bump cdk version --- .../connectors/source-bing-ads/poetry.lock | 9 +++++---- .../connectors/source-bing-ads/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/poetry.lock b/airbyte-integrations/connectors/source-bing-ads/poetry.lock index dd3eb381027a..37c7f108a9b1 100644 --- a/airbyte-integrations/connectors/source-bing-ads/poetry.lock +++ b/airbyte-integrations/connectors/source-bing-ads/poetry.lock @@ -2,14 +2,14 @@ [[package]] name = "airbyte-cdk" -version = "6.48.2.post1.dev14733922675" +version = "6.48.5" description = "A framework for writing Airbyte Connectors." optional = false python-versions = "<3.13,>=3.10" groups = ["main"] files = [ - {file = "airbyte_cdk-6.48.2.post1.dev14733922675-py3-none-any.whl", hash = "sha256:726ba096e4fa22871f2d3e9330a01ff3b70940a977e40bdc3b5b3531deeefcdf"}, - {file = "airbyte_cdk-6.48.2.post1.dev14733922675.tar.gz", hash = "sha256:016399d6aa7724f305c7bb8c8640d71e9bfd35c864df5f0a4147c05a6b88138b"}, + {file = "airbyte_cdk-6.48.5-py3-none-any.whl", hash = "sha256:51dae61f8c696efcd54a1db395e3a2025bb6728a3653b3a677703de0d574b1f9"}, + {file = "airbyte_cdk-6.48.5.tar.gz", hash = "sha256:0a9d5afd0e3f010c79e663b5c123091b8285b3720e2959c28280a52cf537dbe9"}, ] [package.dependencies] @@ -45,6 +45,7 @@ PyYAML = ">=6.0.1,<7.0.0" rapidfuzz = ">=3.10.1,<4.0.0" requests = "*" requests_cache = "*" +rich = "*" rich-click = ">=1.8.8,<2.0.0" serpyco-rs = ">=1.10.2,<2.0.0" typing-extensions = "*" @@ -2643,4 +2644,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12" -content-hash = "aaf4612335ace1a51e932e1fae259cfb18b9e01e33d3f3695a2182f3cd9ef16c" +content-hash = "eb326fac6ee6f9acf3dcc6031b12edc95d845eec49d042e875785eedb64a2973" diff --git a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml index dce339a9ba9a..805fbc08bd8e 100644 --- a/airbyte-integrations/connectors/source-bing-ads/pyproject.toml +++ b/airbyte-integrations/connectors/source-bing-ads/pyproject.toml @@ -19,7 +19,7 @@ include = "source_bing_ads" python = "^3.10,<3.12" bingads = "==13.0.18.1" urllib3 = "==1.26.18" -airbyte-cdk = "6.48.2.post1.dev14733922675" +airbyte-cdk = "^6" cached-property = "==1.5.2" pendulum = "<3.0.0" From bf029a81dbe7c04e163b50721c2ea4d050d5906d Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 1 May 2025 16:43:40 -0700 Subject: [PATCH 27/31] add transformations for id and date --- .../source-bing-ads/source_bing_ads/manifest.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 8967e50fe819..69a74ab2e24e 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -341,10 +341,23 @@ definitions: transformations: - type: AddFields fields: + - type: AddedFieldDefinition + path: + - LinkedAgencies + value: | + {% set linked_agencies = [] %} + {% for agency in (record.get('LinkedAgencies') or []) %} + {% set _ = linked_agencies.append({ "Id": agency.Id|int, "Name": agency.Name }) %} + {% endfor %} + {{ linked_agencies }} - type: AddedFieldDefinition path: - LinkedAgencies value: '{{ { "CustomerInfo": record.LinkedAgencies } }}' + - type: AddedFieldDefinition + path: + - LastModifiedTime + value: '{{ format_datetime(record.LastModifiedTime, "%Y-%m-%dT%H:%M:%S.%f" ) }}' streams: - $ref: "#/definitions/accounts_stream" From 16243e3892fe1257683ccc9a5184aaabc242ca3f Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Thu, 1 May 2025 17:00:05 -0700 Subject: [PATCH 28/31] move accounts schema to schemas section --- .../source_bing_ads/manifest.yaml | 488 +++++++++--------- 1 file changed, 246 insertions(+), 242 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml index 69a74ab2e24e..61483fbade16 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/manifest.yaml @@ -56,249 +56,9 @@ definitions: primary_key: Id schema_loader: type: InlineSchemaLoader - file_path: "./source_bing_ads/schemas/accounts.json" schema: - $schema: http://json-schema.org/draft-07/schema# - type: object - properties: - Id: - description: ID of the account - type: - - "null" - - integer - AccountFinancialStatus: - description: The financial status of the account - type: - - "null" - - string - AccountLifeCycleStatus: - description: The life cycle status of the account - type: - - "null" - - string - AutoTagType: - description: The type of auto-tagging - type: - - "null" - - string - AccountMode: - description: The mode of the account - type: - - "null" - - string - ForwardCompatibilityMap: - description: Map for forward compatibility - type: - - "null" - - string - PaymentMethodType: - description: Type of the payment method - type: - - "null" - - string - Language: - description: The language used in the account - type: - - "null" - - string - LinkedAgencies: - description: The agencies linked to the account for management purposes. - type: - - "null" - - object - properties: - Id: - description: ID of the linked agency - type: - - "null" - - integer - Name: - description: Name of the linked agency - type: - - "null" - - string - TaxInformation: - description: Tax information of the account - type: - - "null" - - string - CurrencyCode: - description: The currency code used by the account - type: - - "null" - - string - TimeZone: - description: The time zone of the account - type: - - "null" - - string - BusinessAddress: - description: The business address associated with the account. - type: - - "null" - - object - properties: - City: - description: The city of the business address - type: - - "null" - - string - CountryCode: - description: The country code of the business address - type: - - "null" - - string - Id: - description: ID of the business address - type: - - "null" - - integer - Line1: - description: Address line 1 - type: - - "null" - - string - Line2: - description: Address line 2 - type: - - "null" - - string - Line3: - description: Address line 3 - type: - - "null" - - string - Line4: - description: Address line 4 - type: - - "null" - - string - PostalCode: - description: The postal code of the business address - type: - - "null" - - string - StateOrProvince: - description: The state or province of the business address - type: - - "null" - - string - TimeStamp: - description: Timestamp of the business address - type: - - "null" - - string - BusinessName: - description: The business name - type: - - "null" - - string - BackUpPaymentInstrumentId: - description: ID of the backup payment instrument - type: - - "null" - - integer - BillingThresholdAmount: - description: The threshold amount for billing - type: - - "null" - - number - BillToCustomerId: - description: Customer ID for billing - type: - - "null" - - integer - LastModifiedByUserId: - description: ID of the user who last modified the account - type: - - "null" - - integer - LastModifiedTime: - description: The date and time of the last modification - type: - - "null" - - string - format: date-time - airbyte_type: timestamp_without_timezone - Name: - description: The name of the account - type: - - "null" - - string - Number: - description: The account number - type: - - "null" - - string - ParentCustomerId: - description: ID of the parent customer - type: - - "null" - - integer - PauseReason: - description: Reason for pausing the account - type: - - "null" - - integer - PaymentMethodId: - description: ID of the payment method - type: - - "null" - - integer - PrimaryUserId: - description: ID of the primary user - type: - - "null" - - integer - SalesHouseCustomerId: - description: Customer ID for sales house - type: - - "null" - - integer - SoldToPaymentInstrumentId: - description: ID of the payment instrument for sales - type: - - "null" - - integer - TimeStamp: - description: Timestamp of the account - type: - - "null" - - string - TaxCertificate: - type: - - "null" - - object - properties: - TaxCertificateBlobContainerName: - type: - - "null" - - string - Status: - type: - - "null" - - string - enum: - - Invalid - - Pending - - Valid - TaxCertificates: - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - key: - type: - - "null" - - string - value: - type: - - "null" - - string + $ref: "#/schemas/accounts" + retriever: type: SimpleRetriever requester: @@ -362,6 +122,250 @@ definitions: streams: - $ref: "#/definitions/accounts_stream" +schemas: + accounts: + $schema: http://json-schema.org/draft-07/schema# + type: object + properties: + Id: + description: ID of the account + type: + - "null" + - integer + AccountFinancialStatus: + description: The financial status of the account + type: + - "null" + - string + AccountLifeCycleStatus: + description: The life cycle status of the account + type: + - "null" + - string + AutoTagType: + description: The type of auto-tagging + type: + - "null" + - string + AccountMode: + description: The mode of the account + type: + - "null" + - string + ForwardCompatibilityMap: + description: Map for forward compatibility + type: + - "null" + - string + PaymentMethodType: + description: Type of the payment method + type: + - "null" + - string + Language: + description: The language used in the account + type: + - "null" + - string + LinkedAgencies: + description: The agencies linked to the account for management purposes. + type: + - "null" + - object + properties: + Id: + description: ID of the linked agency + type: + - "null" + - integer + Name: + description: Name of the linked agency + type: + - "null" + - string + TaxInformation: + description: Tax information of the account + type: + - "null" + - string + CurrencyCode: + description: The currency code used by the account + type: + - "null" + - string + TimeZone: + description: The time zone of the account + type: + - "null" + - string + BusinessAddress: + description: The business address associated with the account. + type: + - "null" + - object + properties: + City: + description: The city of the business address + type: + - "null" + - string + CountryCode: + description: The country code of the business address + type: + - "null" + - string + Id: + description: ID of the business address + type: + - "null" + - integer + Line1: + description: Address line 1 + type: + - "null" + - string + Line2: + description: Address line 2 + type: + - "null" + - string + Line3: + description: Address line 3 + type: + - "null" + - string + Line4: + description: Address line 4 + type: + - "null" + - string + PostalCode: + description: The postal code of the business address + type: + - "null" + - string + StateOrProvince: + description: The state or province of the business address + type: + - "null" + - string + TimeStamp: + description: Timestamp of the business address + type: + - "null" + - string + BusinessName: + description: The business name + type: + - "null" + - string + BackUpPaymentInstrumentId: + description: ID of the backup payment instrument + type: + - "null" + - integer + BillingThresholdAmount: + description: The threshold amount for billing + type: + - "null" + - number + BillToCustomerId: + description: Customer ID for billing + type: + - "null" + - integer + LastModifiedByUserId: + description: ID of the user who last modified the account + type: + - "null" + - integer + LastModifiedTime: + description: The date and time of the last modification + type: + - "null" + - string + format: date-time + airbyte_type: timestamp_without_timezone + Name: + description: The name of the account + type: + - "null" + - string + Number: + description: The account number + type: + - "null" + - string + ParentCustomerId: + description: ID of the parent customer + type: + - "null" + - integer + PauseReason: + description: Reason for pausing the account + type: + - "null" + - integer + PaymentMethodId: + description: ID of the payment method + type: + - "null" + - integer + PrimaryUserId: + description: ID of the primary user + type: + - "null" + - integer + SalesHouseCustomerId: + description: Customer ID for sales house + type: + - "null" + - integer + SoldToPaymentInstrumentId: + description: ID of the payment instrument for sales + type: + - "null" + - integer + TimeStamp: + description: Timestamp of the account + type: + - "null" + - string + TaxCertificate: + type: + - "null" + - object + properties: + TaxCertificateBlobContainerName: + type: + - "null" + - string + Status: + type: + - "null" + - string + enum: + - Invalid + - Pending + - Valid + TaxCertificates: + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + key: + type: + - "null" + - string + value: + type: + - "null" + - string + concurrency_level: type: ConcurrencyLevel default_concurrency: 2 From 433987974331357c87510dcefb1591d2e1fccfd0 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 5 May 2025 18:13:45 -0600 Subject: [PATCH 29/31] add test for linked agencies --- .../integrations/test_accounts_stream.py | 30 +++ .../accounts_search_with_linked_agencies.json | 173 ++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 61adbf3071d3..86876d378cfb 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -55,3 +55,33 @@ def test_read_accounts_tax_certificate_data(self): "TaxCertificateBlobContainerName": "Test Container Name", "TaxCertificates": [{"key": "test_key", "value": "test_value"}], } + + + def test_read_linked_agencies_data(self): + """ + Test reading linked agencies data from the accounts stream. + We are manually putting the data in CustomerInfo field through a transformation + to keep it backward compatible with the SOAP response. + """ + http_mocker = self.http_mocker + http_mocker.post( + RequestBuilder(resource="User/Query").with_body('{"UserId": null}').build(), + HttpResponse(json.dumps(find_template("user_query", __file__)), 200), + ) + http_mocker.post( + RequestBuilder(resource="Accounts/Search") + .with_body( + b'{"PageInfo": {"Index": 0, "Size": 1000}, "Predicates": [{"Field": "UserId", "Operator": "Equals", "Value": "123456789"}], "ReturnAdditionalFields": "TaxCertificate,AccountMode"}' + ) + .build(), + HttpResponse(json.dumps(find_template("accounts_search_with_linked_agencies", __file__)), 200), + ) + + # Our account doesn't have configured Tax certificate. + output = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config) + assert output.records[0].record.data["LinkedAgencies"] == { + "CustomerInfo": [{ + "Id": 123456789, + "Name": "Ramp (MCC)", + }] + } diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json new file mode 100644 index 000000000000..db57e8d61bf5 --- /dev/null +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json @@ -0,0 +1,173 @@ +{ + "Accounts": [ + { + "TaxCertificate": { + "Status": "Active", + "TaxCertificateBlobContainerName": "Test Container Name", + "TaxCertificates": [{ "key": "test_key", "value": "test_value" }] + }, + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "Hold", + "Id": "180278106", + "Language": "English", + "LastModifiedByUserId": "0", + "LastModifiedTime": "2025-02-20T05:26:37.2", + "Name": "Example Inc.", + "Number": "EX123456", + "ParentCustomerId": "987654321", + "PaymentMethodId": "138188746", + "PaymentMethodType": "CreditCard", + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Active", + "TimeStamp": "AAAAAH1yyMo=", + "TimeZone": "Arizona", + "PauseReason": null, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [{"Id": "123456789", "Name": "Ramp (MCC)"}], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Francisco", + "CountryCode": "US", + "Id": "149004358", + "Line1": "123 Example Street", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "12345", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "Fake Inc." + }, + "AutoTagType": "Inactive", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" + }, + { + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "Hold", + "Id": "180519267", + "Language": "English", + "LastModifiedByUserId": "3", + "LastModifiedTime": "2024-04-18T01:38:27.893", + "Name": "Fake", + "Number": "F149MJ18", + "ParentCustomerId": "987654321", + "PaymentMethodId": "157014353", + "PaymentMethodType": "CreditCard", + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Active", + "TimeStamp": "AAAAAIcQrSU=", + "TimeZone": "CentralTimeUSCanada", + "PauseReason": null, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Francisco", + "CountryCode": "US", + "Id": "149649761", + "Line1": "456 Sample Ave", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "67890", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "Fake" + }, + "AutoTagType": "Preserve", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" + }, + { + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "ClearFinancialStatus", + "Id": "180535609", + "Language": "English", + "LastModifiedByUserId": "0", + "LastModifiedTime": "2023-08-11T08:24:26.603", + "Name": "DEMO-ACCOUNT", + "Number": "F149W3B6", + "ParentCustomerId": "987654321", + "PaymentMethodId": null, + "PaymentMethodType": null, + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Pause", + "TimeStamp": "AAAAAH10c1A=", + "TimeZone": "Santiago", + "PauseReason": 2, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Pancho", + "CountryCode": "US", + "Id": "149694999", + "Line1": "789 Test Blvd", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "54321", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "Fake Inc." + }, + "AutoTagType": "Inactive", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" + }, + { + "BillToCustomerId": "987654321", + "CurrencyCode": "USD", + "AccountFinancialStatus": "ClearFinancialStatus", + "Id": "180767304", + "Language": "English", + "LastModifiedByUserId": "123456789", + "LastModifiedTime": "2025-04-10T17:52:22.877", + "Name": "Test Manager Account", + "Number": "F332JDYP", + "ParentCustomerId": "987654321", + "PaymentMethodId": null, + "PaymentMethodType": null, + "PrimaryUserId": "123456789", + "AccountLifeCycleStatus": "Pending", + "TimeStamp": "AAAAAJNgyw4=", + "TimeZone": "PacificTimeUSCanadaTijuana", + "PauseReason": null, + "ForwardCompatibilityMap": null, + "LinkedAgencies": [], + "SalesHouseCustomerId": null, + "TaxInformation": [], + "BackUpPaymentInstrumentId": null, + "BillingThresholdAmount": null, + "BusinessAddress": { + "City": "San Pancho", + "CountryCode": "US", + "Id": "123456789", + "Line1": "101 Fake Lane", + "Line2": null, + "Line3": null, + "Line4": null, + "PostalCode": "98765", + "StateOrProvince": "CA", + "TimeStamp": null, + "BusinessName": "FakeBusiness Inc." + }, + "AutoTagType": "Inactive", + "SoldToPaymentInstrumentId": null, + "AccountMode": "Expert" + } + ] +} From 8bb767bdc78eba0d6f51ef19399552ac8decacaa Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Mon, 5 May 2025 18:14:32 -0600 Subject: [PATCH 30/31] ruff format --- .../unit_tests/integrations/test_accounts_stream.py | 11 ++++++----- .../accounts_search_with_linked_agencies.json | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py index 86876d378cfb..c81f56100921 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/integrations/test_accounts_stream.py @@ -56,7 +56,6 @@ def test_read_accounts_tax_certificate_data(self): "TaxCertificates": [{"key": "test_key", "value": "test_value"}], } - def test_read_linked_agencies_data(self): """ Test reading linked agencies data from the accounts stream. @@ -80,8 +79,10 @@ def test_read_linked_agencies_data(self): # Our account doesn't have configured Tax certificate. output = self.read_stream(self.stream_name, SyncMode.full_refresh, self._config) assert output.records[0].record.data["LinkedAgencies"] == { - "CustomerInfo": [{ - "Id": 123456789, - "Name": "Ramp (MCC)", - }] + "CustomerInfo": [ + { + "Id": 123456789, + "Name": "Ramp (MCC)", + } + ] } diff --git a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json index db57e8d61bf5..e497a3f59b3a 100644 --- a/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json +++ b/airbyte-integrations/connectors/source-bing-ads/unit_tests/resource/http/response/accounts_search_with_linked_agencies.json @@ -24,7 +24,7 @@ "TimeZone": "Arizona", "PauseReason": null, "ForwardCompatibilityMap": null, - "LinkedAgencies": [{"Id": "123456789", "Name": "Ramp (MCC)"}], + "LinkedAgencies": [{ "Id": "123456789", "Name": "Ramp (MCC)" }], "SalesHouseCustomerId": null, "TaxInformation": [], "BackUpPaymentInstrumentId": null, From 1faccba4222089aca8492971c4418cca3fa622e4 Mon Sep 17 00:00:00 2001 From: Aldo Gonzalez Date: Tue, 6 May 2025 08:39:30 -0600 Subject: [PATCH 31/31] update release information --- docs/integrations/sources/bing-ads.md | 196 +++++++++++++------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/docs/integrations/sources/bing-ads.md b/docs/integrations/sources/bing-ads.md index c8cf2526f5dc..f0b7b8d815e9 100644 --- a/docs/integrations/sources/bing-ads.md +++ b/docs/integrations/sources/bing-ads.md @@ -259,104 +259,104 @@ The Bing Ads API limits the number of requests for all Microsoft Advertising cli
Expand to review -| Version | Date | Pull Request | Subject | -|:--------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 2.9.0-rc.1 | 2025-04-23 | [58595](https://github.com/airbytehq/airbyte/pull/58595) | Update CDK version | -| 2.8.13 | 2025-02-15 | [53882](https://github.com/airbytehq/airbyte/pull/53882) | Update dependencies | -| 2.8.12 | 2025-02-01 | [52930](https://github.com/airbytehq/airbyte/pull/52930) | Update dependencies | -| 2.8.11 | 2025-01-25 | [52198](https://github.com/airbytehq/airbyte/pull/52198) | Update dependencies | -| 2.8.10 | 2025-01-18 | [51735](https://github.com/airbytehq/airbyte/pull/51735) | Update dependencies | -| 2.8.9 | 2025-01-11 | [51230](https://github.com/airbytehq/airbyte/pull/51230) | Update dependencies | -| 2.8.8 | 2025-01-04 | [50905](https://github.com/airbytehq/airbyte/pull/50905) | Update dependencies | -| 2.8.7 | 2024-12-28 | [50443](https://github.com/airbytehq/airbyte/pull/50443) | Update dependencies | -| 2.8.6 | 2024-12-21 | [50181](https://github.com/airbytehq/airbyte/pull/50181) | Update dependencies | -| 2.8.5 | 2024-12-14 | [49283](https://github.com/airbytehq/airbyte/pull/49283) | Update dependencies | -| 2.8.4 | 2024-11-25 | [48650](https://github.com/airbytehq/airbyte/pull/48650) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | -| 2.8.3 | 2024-11-04 | [48169](https://github.com/airbytehq/airbyte/pull/48169) | Update dependencies | -| 2.8.2 | 2024-10-29 | [47850](https://github.com/airbytehq/airbyte/pull/47850) | Update dependencies | -| 2.8.1 | 2024-10-28 | [47093](https://github.com/airbytehq/airbyte/pull/47093) | Update dependencies | -| 2.8.0 | 2024-10-21 | [46991](https://github.com/airbytehq/airbyte/pull/46991) | Update CDK to v5 | -| 2.7.9 | 2024-10-12 | [46847](https://github.com/airbytehq/airbyte/pull/46847) | Update dependencies | -| 2.7.8 | 2024-10-05 | [46504](https://github.com/airbytehq/airbyte/pull/46504) | Update dependencies | -| 2.7.7 | 2024-09-28 | [46151](https://github.com/airbytehq/airbyte/pull/46151) | Update dependencies | -| 2.7.6 | 2024-09-21 | [45512](https://github.com/airbytehq/airbyte/pull/45512) | Update dependencies | -| 2.7.5 | 2024-09-07 | [45246](https://github.com/airbytehq/airbyte/pull/45246) | Update dependencies | -| 2.7.4 | 2024-08-31 | [44276](https://github.com/airbytehq/airbyte/pull/44276) | Update dependencies | -| 2.7.3 | 2024-08-12 | [43742](https://github.com/airbytehq/airbyte/pull/43742) | Update dependencies | -| 2.7.2 | 2024-08-10 | [43591](https://github.com/airbytehq/airbyte/pull/43591) | Update dependencies | -| 2.7.1 | 2024-08-03 | [43245](https://github.com/airbytehq/airbyte/pull/43245) | Update dependencies | -| 2.7.0 | 2024-07-31 | [42548](https://github.com/airbytehq/airbyte/pull/42548) | Migrate to CDK v4.1.0 | -| 2.6.12 | 2024-07-27 | [42812](https://github.com/airbytehq/airbyte/pull/42812) | Update dependencies | -| 2.6.11 | 2024-07-20 | [42360](https://github.com/airbytehq/airbyte/pull/42360) | Update dependencies | -| 2.6.10 | 2024-07-13 | [41875](https://github.com/airbytehq/airbyte/pull/41875) | Update dependencies | -| 2.6.9 | 2024-07-10 | [41383](https://github.com/airbytehq/airbyte/pull/41383) | Update dependencies | -| 2.6.8 | 2024-07-09 | [41314](https://github.com/airbytehq/airbyte/pull/41314) | Update dependencies | -| 2.6.7 | 2024-07-06 | [40906](https://github.com/airbytehq/airbyte/pull/40906) | Update dependencies | -| 2.6.6 | 2024-07-05 | [34966](https://github.com/airbytehq/airbyte/pull/34966) | Add support for Performance Max campaigns. | -| 2.6.5 | 2024-06-27 | [40585](https://github.com/airbytehq/airbyte/pull/40585) | Replaced deprecated AirbyteLogger with logging.Logger | -| 2.6.4 | 2024-06-25 | [40457](https://github.com/airbytehq/airbyte/pull/40457) | Update dependencies | -| 2.6.3 | 2024-06-22 | [40006](https://github.com/airbytehq/airbyte/pull/40006) | Update dependencies | -| 2.6.2 | 2024-06-06 | [39177](https://github.com/airbytehq/airbyte/pull/39177) | [autopull] Upgrade base image to v1.2.2 | -| 2.6.1 | 2024-05-02 | [36632](https://github.com/airbytehq/airbyte/pull/36632) | Schema descriptions | -| 2.6.0 | 2024-04-25 | [35878](https://github.com/airbytehq/airbyte/pull/35878) | Add missing fields in keyword_performance_report | -| 2.5.0 | 2024-03-21 | [35891](https://github.com/airbytehq/airbyte/pull/35891) | Accounts stream: add TaxCertificate field to schema | -| 2.4.0 | 2024-03-19 | [36267](https://github.com/airbytehq/airbyte/pull/36267) | Pin airbyte-cdk version to `^0` | -| 2.3.0 | 2024-03-05 | [35812](https://github.com/airbytehq/airbyte/pull/35812) | New streams: Audience Performance Report, Goals And Funnels Report, Product Dimension Performance Report. | -| 2.2.0 | 2024-02-13 | [35201](https://github.com/airbytehq/airbyte/pull/35201) | New streams: Budget and Product Dimension Performance. | -| 2.1.4 | 2024-02-12 | [35179](https://github.com/airbytehq/airbyte/pull/35179) | Manage dependencies with Poetry | -| 2.1.3 | 2024-01-31 | [34712](https://github.com/airbytehq/airbyte/pull/34712) | Fix duplicated records for report-based streams | -| 2.1.2 | 2024-01-09 | [34045](https://github.com/airbytehq/airbyte/pull/34045) | Speed up record transformation | -| 2.1.1 | 2023-12-15 | [33500](https://github.com/airbytehq/airbyte/pull/33500) | Fix state setter when state was provided | -| 2.1.0 | 2023-12-05 | [33095](https://github.com/airbytehq/airbyte/pull/33095) | Add account filtering | -| 2.0.1 | 2023-11-16 | [32597](https://github.com/airbytehq/airbyte/pull/32597) | Fix start date parsing from stream state | -| 2.0.0 | 2023-11-07 | [31995](https://github.com/airbytehq/airbyte/pull/31995) | Schema update for Accounts, Campaigns and Search Query Performance Report streams. Convert `date` and `date-time` fields to standard `RFC3339` | -| 1.13.0 | 2023-11-13 | [32306](https://github.com/airbytehq/airbyte/pull/32306) | Add Custom reports and decrease backoff max tries number | -| 1.12.1 | 2023-11-10 | [32422](https://github.com/airbytehq/airbyte/pull/32422) | Normalize numeric values in reports | -| 1.12.0 | 2023-11-09 | [32340](https://github.com/airbytehq/airbyte/pull/32340) | Remove default start date in favor of Time Period - Last Year and This Year, if start date is not provided | -| 1.11.0 | 2023-11-06 | [32201](https://github.com/airbytehq/airbyte/pull/32201) | Skip broken CSV report files | -| 1.10.0 | 2023-11-06 | [32148](https://github.com/airbytehq/airbyte/pull/32148) | Add new fields to stream Ads: "BusinessName", "CallToAction", "Headline", "Images", "Videos", "Text" | -| 1.9.0 | 2023-11-03 | [32131](https://github.com/airbytehq/airbyte/pull/32131) | Add "CampaignId", "AccountId", "CustomerId" fields to Ad Groups, Ads and Campaigns streams. | -| 1.8.0 | 2023-11-02 | [32059](https://github.com/airbytehq/airbyte/pull/32059) | Add new streams `CampaignImpressionPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.7.1 | 2023-11-02 | [32088](https://github.com/airbytehq/airbyte/pull/32088) | Raise config error when user does not have accounts | -| 1.7.0 | 2023-11-01 | [32027](https://github.com/airbytehq/airbyte/pull/32027) | Add new streams `AdGroupImpressionPerformanceReport` | -| 1.6.0 | 2023-10-31 | [32008](https://github.com/airbytehq/airbyte/pull/32008) | Add new streams `Keywords` | -| 1.5.0 | 2023-10-30 | [31952](https://github.com/airbytehq/airbyte/pull/31952) | Add new streams `Labels`, `App install ads`, `Keyword Labels`, `Campaign Labels`, `App Install Ad Labels`, `Ad Group Labels` | -| 1.4.0 | 2023-10-27 | [31885](https://github.com/airbytehq/airbyte/pull/31885) | Add new stream: `AccountImpressionPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.3.0 | 2023-10-26 | [31837](https://github.com/airbytehq/airbyte/pull/31837) | Add new stream: `UserLocationPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.2.0 | 2023-10-24 | [31783](https://github.com/airbytehq/airbyte/pull/31783) | Add new stream: `SearchQueryPerformanceReport` (daily, hourly, weekly, monthly) | -| 1.1.0 | 2023-10-24 | [31712](https://github.com/airbytehq/airbyte/pull/31712) | Add new stream: `AgeGenderAudienceReport` (daily, hourly, weekly, monthly) | -| 1.0.2 | 2023-10-19 | [31599](https://github.com/airbytehq/airbyte/pull/31599) | Base image migration: remove Dockerfile and use the python-connector-base image | -| 1.0.1 | 2023-10-16 | [31432](https://github.com/airbytehq/airbyte/pull/31432) | Remove primary keys from the geographic performance reports - complete what was missed in version 1.0.0 | -| 1.0.0 | 2023-10-11 | [31277](https://github.com/airbytehq/airbyte/pull/31277) | Remove primary keys from the geographic performance reports | -| 0.2.3 | 2023-09-28 | [30834](https://github.com/airbytehq/airbyte/pull/30834) | Wrap auth error with the config error | -| 0.2.2 | 2023-09-27 | [30791](https://github.com/airbytehq/airbyte/pull/30791) | Fix missing fields for geographic performance reports | -| 0.2.1 | 2023-09-04 | [30128](https://github.com/airbytehq/airbyte/pull/30128) | Add increasing download timeout if ReportingDownloadException occurs | -| 0.2.0 | 2023-08-17 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Add Geographic Performance Report | -| 0.1.24 | 2023-06-22 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Retry request after facing temporary name resolution error | -| 0.1.23 | 2023-05-11 | [25996](https://github.com/airbytehq/airbyte/pull/25996) | Implement a retry logic if SSL certificate validation fails | -| 0.1.22 | 2023-05-08 | [24223](https://github.com/airbytehq/airbyte/pull/24223) | Add CampaignLabels report column in campaign performance report | -| 0.1.21 | 2023-04-28 | [25668](https://github.com/airbytehq/airbyte/pull/25668) | Add undeclared fields to accounts, campaigns, campaign_performance_report, keyword_performance_report and account_performance_report streams | -| 0.1.20 | 2023-03-09 | [23663](https://github.com/airbytehq/airbyte/pull/23663) | Add lookback window for performance reports in incremental mode | -| 0.1.19 | 2023-03-08 | [23868](https://github.com/airbytehq/airbyte/pull/23868) | Add dimensional-type columns for reports | -| 0.1.18 | 2023-01-30 | [22073](https://github.com/airbytehq/airbyte/pull/22073) | Fix null values in the `Keyword` column of `keyword_performance_report` streams | -| 0.1.17 | 2022-12-10 | [20005](https://github.com/airbytehq/airbyte/pull/20005) | Add `Keyword` to `keyword_performance_report` stream | -| 0.1.16 | 2022-10-12 | [17873](https://github.com/airbytehq/airbyte/pull/17873) | Fix: added missing campaign types in (Audience, Shopping and DynamicSearchAds) in campaigns stream | -| 0.1.15 | 2022-10-03 | [17505](https://github.com/airbytehq/airbyte/pull/17505) | Fix: limit cache size for ServiceClient instances | -| 0.1.14 | 2022-09-29 | [17403](https://github.com/airbytehq/airbyte/pull/17403) | Fix: limit cache size for ReportingServiceManager instances | -| 0.1.13 | 2022-09-29 | [17386](https://github.com/airbytehq/airbyte/pull/17386) | Migrate to per-stream states | -| 0.1.12 | 2022-09-05 | [16335](https://github.com/airbytehq/airbyte/pull/16335) | Added backoff for socket.timeout | -| 0.1.11 | 2022-08-25 | [15684](https://github.com/airbytehq/airbyte/pull/15684) (published in [15987](https://github.com/airbytehq/airbyte/pull/15987)) | Fixed log messages being unreadable | -| 0.1.10 | 2022-08-12 | [15602](https://github.com/airbytehq/airbyte/pull/15602) | Fixed bug caused Hourly Reports to crash due to invalid fields set | -| 0.1.9 | 2022-08-02 | [14862](https://github.com/airbytehq/airbyte/pull/14862) | Added missing columns | -| 0.1.8 | 2022-06-15 | [13801](https://github.com/airbytehq/airbyte/pull/13801) | All reports `hourly/daily/weekly/monthly` will be generated by default, these options are removed from input configuration | -| 0.1.7 | 2022-05-17 | [12937](https://github.com/airbytehq/airbyte/pull/12937) | Added OAuth2.0 authentication method, removed `redirect_uri` from input configuration | -| 0.1.6 | 2022-04-30 | [12500](https://github.com/airbytehq/airbyte/pull/12500) | Improve input configuration copy | -| 0.1.5 | 2022-01-01 | [11652](https://github.com/airbytehq/airbyte/pull/11652) | Rebump attempt after DockerHub failure at registring the 0.1.4 | -| 0.1.4 | 2022-03-22 | [11311](https://github.com/airbytehq/airbyte/pull/11311) | Added optional Redirect URI & Tenant ID to spec | -| 0.1.3 | 2022-01-14 | [9510](https://github.com/airbytehq/airbyte/pull/9510) | Fixed broken dependency that blocked connector's operations | -| 0.1.2 | 2021-12-14 | [8429](https://github.com/airbytehq/airbyte/pull/8429) | Update titles and descriptions | -| 0.1.1 | 2021-08-31 | [5750](https://github.com/airbytehq/airbyte/pull/5750) | Added reporting streams | -| 0.1.0 | 2021-07-22 | [4911](https://github.com/airbytehq/airbyte/pull/4911) | Initial release supported core streams \(Accounts, Campaigns, Ads, AdGroups\) | +| Version | Date | Pull Request | Subject | +|:--------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------| +| 2.9.0-rc.1 | 2025-05-06 | [59136](https://github.com/airbytehq/airbyte/pull/59136) | Bump CDK v6 and migrate Accounts stream to low-code | +| 2.8.13 | 2025-02-15 | [53882](https://github.com/airbytehq/airbyte/pull/53882) | Update dependencies | +| 2.8.12 | 2025-02-01 | [52930](https://github.com/airbytehq/airbyte/pull/52930) | Update dependencies | +| 2.8.11 | 2025-01-25 | [52198](https://github.com/airbytehq/airbyte/pull/52198) | Update dependencies | +| 2.8.10 | 2025-01-18 | [51735](https://github.com/airbytehq/airbyte/pull/51735) | Update dependencies | +| 2.8.9 | 2025-01-11 | [51230](https://github.com/airbytehq/airbyte/pull/51230) | Update dependencies | +| 2.8.8 | 2025-01-04 | [50905](https://github.com/airbytehq/airbyte/pull/50905) | Update dependencies | +| 2.8.7 | 2024-12-28 | [50443](https://github.com/airbytehq/airbyte/pull/50443) | Update dependencies | +| 2.8.6 | 2024-12-21 | [50181](https://github.com/airbytehq/airbyte/pull/50181) | Update dependencies | +| 2.8.5 | 2024-12-14 | [49283](https://github.com/airbytehq/airbyte/pull/49283) | Update dependencies | +| 2.8.4 | 2024-11-25 | [48650](https://github.com/airbytehq/airbyte/pull/48650) | Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64 | +| 2.8.3 | 2024-11-04 | [48169](https://github.com/airbytehq/airbyte/pull/48169) | Update dependencies | +| 2.8.2 | 2024-10-29 | [47850](https://github.com/airbytehq/airbyte/pull/47850) | Update dependencies | +| 2.8.1 | 2024-10-28 | [47093](https://github.com/airbytehq/airbyte/pull/47093) | Update dependencies | +| 2.8.0 | 2024-10-21 | [46991](https://github.com/airbytehq/airbyte/pull/46991) | Update CDK to v5 | +| 2.7.9 | 2024-10-12 | [46847](https://github.com/airbytehq/airbyte/pull/46847) | Update dependencies | +| 2.7.8 | 2024-10-05 | [46504](https://github.com/airbytehq/airbyte/pull/46504) | Update dependencies | +| 2.7.7 | 2024-09-28 | [46151](https://github.com/airbytehq/airbyte/pull/46151) | Update dependencies | +| 2.7.6 | 2024-09-21 | [45512](https://github.com/airbytehq/airbyte/pull/45512) | Update dependencies | +| 2.7.5 | 2024-09-07 | [45246](https://github.com/airbytehq/airbyte/pull/45246) | Update dependencies | +| 2.7.4 | 2024-08-31 | [44276](https://github.com/airbytehq/airbyte/pull/44276) | Update dependencies | +| 2.7.3 | 2024-08-12 | [43742](https://github.com/airbytehq/airbyte/pull/43742) | Update dependencies | +| 2.7.2 | 2024-08-10 | [43591](https://github.com/airbytehq/airbyte/pull/43591) | Update dependencies | +| 2.7.1 | 2024-08-03 | [43245](https://github.com/airbytehq/airbyte/pull/43245) | Update dependencies | +| 2.7.0 | 2024-07-31 | [42548](https://github.com/airbytehq/airbyte/pull/42548) | Migrate to CDK v4.1.0 | +| 2.6.12 | 2024-07-27 | [42812](https://github.com/airbytehq/airbyte/pull/42812) | Update dependencies | +| 2.6.11 | 2024-07-20 | [42360](https://github.com/airbytehq/airbyte/pull/42360) | Update dependencies | +| 2.6.10 | 2024-07-13 | [41875](https://github.com/airbytehq/airbyte/pull/41875) | Update dependencies | +| 2.6.9 | 2024-07-10 | [41383](https://github.com/airbytehq/airbyte/pull/41383) | Update dependencies | +| 2.6.8 | 2024-07-09 | [41314](https://github.com/airbytehq/airbyte/pull/41314) | Update dependencies | +| 2.6.7 | 2024-07-06 | [40906](https://github.com/airbytehq/airbyte/pull/40906) | Update dependencies | +| 2.6.6 | 2024-07-05 | [34966](https://github.com/airbytehq/airbyte/pull/34966) | Add support for Performance Max campaigns. | +| 2.6.5 | 2024-06-27 | [40585](https://github.com/airbytehq/airbyte/pull/40585) | Replaced deprecated AirbyteLogger with logging.Logger | +| 2.6.4 | 2024-06-25 | [40457](https://github.com/airbytehq/airbyte/pull/40457) | Update dependencies | +| 2.6.3 | 2024-06-22 | [40006](https://github.com/airbytehq/airbyte/pull/40006) | Update dependencies | +| 2.6.2 | 2024-06-06 | [39177](https://github.com/airbytehq/airbyte/pull/39177) | [autopull] Upgrade base image to v1.2.2 | +| 2.6.1 | 2024-05-02 | [36632](https://github.com/airbytehq/airbyte/pull/36632) | Schema descriptions | +| 2.6.0 | 2024-04-25 | [35878](https://github.com/airbytehq/airbyte/pull/35878) | Add missing fields in keyword_performance_report | +| 2.5.0 | 2024-03-21 | [35891](https://github.com/airbytehq/airbyte/pull/35891) | Accounts stream: add TaxCertificate field to schema | +| 2.4.0 | 2024-03-19 | [36267](https://github.com/airbytehq/airbyte/pull/36267) | Pin airbyte-cdk version to `^0` | +| 2.3.0 | 2024-03-05 | [35812](https://github.com/airbytehq/airbyte/pull/35812) | New streams: Audience Performance Report, Goals And Funnels Report, Product Dimension Performance Report. | +| 2.2.0 | 2024-02-13 | [35201](https://github.com/airbytehq/airbyte/pull/35201) | New streams: Budget and Product Dimension Performance. | +| 2.1.4 | 2024-02-12 | [35179](https://github.com/airbytehq/airbyte/pull/35179) | Manage dependencies with Poetry | +| 2.1.3 | 2024-01-31 | [34712](https://github.com/airbytehq/airbyte/pull/34712) | Fix duplicated records for report-based streams | +| 2.1.2 | 2024-01-09 | [34045](https://github.com/airbytehq/airbyte/pull/34045) | Speed up record transformation | +| 2.1.1 | 2023-12-15 | [33500](https://github.com/airbytehq/airbyte/pull/33500) | Fix state setter when state was provided | +| 2.1.0 | 2023-12-05 | [33095](https://github.com/airbytehq/airbyte/pull/33095) | Add account filtering | +| 2.0.1 | 2023-11-16 | [32597](https://github.com/airbytehq/airbyte/pull/32597) | Fix start date parsing from stream state | +| 2.0.0 | 2023-11-07 | [31995](https://github.com/airbytehq/airbyte/pull/31995) | Schema update for Accounts, Campaigns and Search Query Performance Report streams. Convert `date` and `date-time` fields to standard `RFC3339` | +| 1.13.0 | 2023-11-13 | [32306](https://github.com/airbytehq/airbyte/pull/32306) | Add Custom reports and decrease backoff max tries number | +| 1.12.1 | 2023-11-10 | [32422](https://github.com/airbytehq/airbyte/pull/32422) | Normalize numeric values in reports | +| 1.12.0 | 2023-11-09 | [32340](https://github.com/airbytehq/airbyte/pull/32340) | Remove default start date in favor of Time Period - Last Year and This Year, if start date is not provided | +| 1.11.0 | 2023-11-06 | [32201](https://github.com/airbytehq/airbyte/pull/32201) | Skip broken CSV report files | +| 1.10.0 | 2023-11-06 | [32148](https://github.com/airbytehq/airbyte/pull/32148) | Add new fields to stream Ads: "BusinessName", "CallToAction", "Headline", "Images", "Videos", "Text" | +| 1.9.0 | 2023-11-03 | [32131](https://github.com/airbytehq/airbyte/pull/32131) | Add "CampaignId", "AccountId", "CustomerId" fields to Ad Groups, Ads and Campaigns streams. | +| 1.8.0 | 2023-11-02 | [32059](https://github.com/airbytehq/airbyte/pull/32059) | Add new streams `CampaignImpressionPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.7.1 | 2023-11-02 | [32088](https://github.com/airbytehq/airbyte/pull/32088) | Raise config error when user does not have accounts | +| 1.7.0 | 2023-11-01 | [32027](https://github.com/airbytehq/airbyte/pull/32027) | Add new streams `AdGroupImpressionPerformanceReport` | +| 1.6.0 | 2023-10-31 | [32008](https://github.com/airbytehq/airbyte/pull/32008) | Add new streams `Keywords` | +| 1.5.0 | 2023-10-30 | [31952](https://github.com/airbytehq/airbyte/pull/31952) | Add new streams `Labels`, `App install ads`, `Keyword Labels`, `Campaign Labels`, `App Install Ad Labels`, `Ad Group Labels` | +| 1.4.0 | 2023-10-27 | [31885](https://github.com/airbytehq/airbyte/pull/31885) | Add new stream: `AccountImpressionPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.3.0 | 2023-10-26 | [31837](https://github.com/airbytehq/airbyte/pull/31837) | Add new stream: `UserLocationPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.2.0 | 2023-10-24 | [31783](https://github.com/airbytehq/airbyte/pull/31783) | Add new stream: `SearchQueryPerformanceReport` (daily, hourly, weekly, monthly) | +| 1.1.0 | 2023-10-24 | [31712](https://github.com/airbytehq/airbyte/pull/31712) | Add new stream: `AgeGenderAudienceReport` (daily, hourly, weekly, monthly) | +| 1.0.2 | 2023-10-19 | [31599](https://github.com/airbytehq/airbyte/pull/31599) | Base image migration: remove Dockerfile and use the python-connector-base image | +| 1.0.1 | 2023-10-16 | [31432](https://github.com/airbytehq/airbyte/pull/31432) | Remove primary keys from the geographic performance reports - complete what was missed in version 1.0.0 | +| 1.0.0 | 2023-10-11 | [31277](https://github.com/airbytehq/airbyte/pull/31277) | Remove primary keys from the geographic performance reports | +| 0.2.3 | 2023-09-28 | [30834](https://github.com/airbytehq/airbyte/pull/30834) | Wrap auth error with the config error | +| 0.2.2 | 2023-09-27 | [30791](https://github.com/airbytehq/airbyte/pull/30791) | Fix missing fields for geographic performance reports | +| 0.2.1 | 2023-09-04 | [30128](https://github.com/airbytehq/airbyte/pull/30128) | Add increasing download timeout if ReportingDownloadException occurs | +| 0.2.0 | 2023-08-17 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Add Geographic Performance Report | +| 0.1.24 | 2023-06-22 | [27619](https://github.com/airbytehq/airbyte/pull/27619) | Retry request after facing temporary name resolution error | +| 0.1.23 | 2023-05-11 | [25996](https://github.com/airbytehq/airbyte/pull/25996) | Implement a retry logic if SSL certificate validation fails | +| 0.1.22 | 2023-05-08 | [24223](https://github.com/airbytehq/airbyte/pull/24223) | Add CampaignLabels report column in campaign performance report | +| 0.1.21 | 2023-04-28 | [25668](https://github.com/airbytehq/airbyte/pull/25668) | Add undeclared fields to accounts, campaigns, campaign_performance_report, keyword_performance_report and account_performance_report streams | +| 0.1.20 | 2023-03-09 | [23663](https://github.com/airbytehq/airbyte/pull/23663) | Add lookback window for performance reports in incremental mode | +| 0.1.19 | 2023-03-08 | [23868](https://github.com/airbytehq/airbyte/pull/23868) | Add dimensional-type columns for reports | +| 0.1.18 | 2023-01-30 | [22073](https://github.com/airbytehq/airbyte/pull/22073) | Fix null values in the `Keyword` column of `keyword_performance_report` streams | +| 0.1.17 | 2022-12-10 | [20005](https://github.com/airbytehq/airbyte/pull/20005) | Add `Keyword` to `keyword_performance_report` stream | +| 0.1.16 | 2022-10-12 | [17873](https://github.com/airbytehq/airbyte/pull/17873) | Fix: added missing campaign types in (Audience, Shopping and DynamicSearchAds) in campaigns stream | +| 0.1.15 | 2022-10-03 | [17505](https://github.com/airbytehq/airbyte/pull/17505) | Fix: limit cache size for ServiceClient instances | +| 0.1.14 | 2022-09-29 | [17403](https://github.com/airbytehq/airbyte/pull/17403) | Fix: limit cache size for ReportingServiceManager instances | +| 0.1.13 | 2022-09-29 | [17386](https://github.com/airbytehq/airbyte/pull/17386) | Migrate to per-stream states | +| 0.1.12 | 2022-09-05 | [16335](https://github.com/airbytehq/airbyte/pull/16335) | Added backoff for socket.timeout | +| 0.1.11 | 2022-08-25 | [15684](https://github.com/airbytehq/airbyte/pull/15684) (published in [15987](https://github.com/airbytehq/airbyte/pull/15987)) | Fixed log messages being unreadable | +| 0.1.10 | 2022-08-12 | [15602](https://github.com/airbytehq/airbyte/pull/15602) | Fixed bug caused Hourly Reports to crash due to invalid fields set | +| 0.1.9 | 2022-08-02 | [14862](https://github.com/airbytehq/airbyte/pull/14862) | Added missing columns | +| 0.1.8 | 2022-06-15 | [13801](https://github.com/airbytehq/airbyte/pull/13801) | All reports `hourly/daily/weekly/monthly` will be generated by default, these options are removed from input configuration | +| 0.1.7 | 2022-05-17 | [12937](https://github.com/airbytehq/airbyte/pull/12937) | Added OAuth2.0 authentication method, removed `redirect_uri` from input configuration | +| 0.1.6 | 2022-04-30 | [12500](https://github.com/airbytehq/airbyte/pull/12500) | Improve input configuration copy | +| 0.1.5 | 2022-01-01 | [11652](https://github.com/airbytehq/airbyte/pull/11652) | Rebump attempt after DockerHub failure at registring the 0.1.4 | +| 0.1.4 | 2022-03-22 | [11311](https://github.com/airbytehq/airbyte/pull/11311) | Added optional Redirect URI & Tenant ID to spec | +| 0.1.3 | 2022-01-14 | [9510](https://github.com/airbytehq/airbyte/pull/9510) | Fixed broken dependency that blocked connector's operations | +| 0.1.2 | 2021-12-14 | [8429](https://github.com/airbytehq/airbyte/pull/8429) | Update titles and descriptions | +| 0.1.1 | 2021-08-31 | [5750](https://github.com/airbytehq/airbyte/pull/5750) | Added reporting streams | +| 0.1.0 | 2021-07-22 | [4911](https://github.com/airbytehq/airbyte/pull/4911) | Initial release supported core streams \(Accounts, Campaigns, Ads, AdGroups\) |