diff --git a/airbyte-integrations/connectors/source-shopify/acceptance-test-config.yml b/airbyte-integrations/connectors/source-shopify/acceptance-test-config.yml index fa685bce30ea..5473d1c9d319 100644 --- a/airbyte-integrations/connectors/source-shopify/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-shopify/acceptance-test-config.yml @@ -24,10 +24,6 @@ acceptance_tests: discovery: tests: - config_path: "secrets/config.json" - backward_compatibility_tests_config: - # the `product_variants` steam schema has changed, mainly: - # see this PR: https://github.com/airbytehq/airbyte/pull/37767 - disable_for_version: "2.0.8" basic_read: tests: - config_path: "secrets/config_transactions_with_user_id.json" diff --git a/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records.jsonl index 8530d696fe55..0a8c0a0f5495 100644 --- a/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records.jsonl @@ -24,9 +24,9 @@ {"stream": "fulfillments", "data": {"id": 4075788501181, "admin_graphql_api_id": "gid://shopify/Fulfillment/4075788501181", "created_at": "2022-06-15T05:16:55-07:00", "location_id": 63590301885, "name": "#1136.1", "order_id": 4554821468349, "origin_address": {}, "receipt": {}, "service": "manual", "shipment_status": null, "status": "success", "tracking_company": null, "tracking_number": null, "tracking_numbers": [], "tracking_url": null, "tracking_urls": [], "updated_at": "2022-06-15T05:16:55-07:00", "line_items": [{"id": 11406125564093, "admin_graphql_api_id": "gid://shopify/LineItem/11406125564093", "fulfillable_quantity": 0, "fulfillment_service": "manual", "fulfillment_status": "fulfilled", "gift_card": false, "grams": 0, "name": "All Black Sneaker Right Foot - ivory", "price": "59.00", "price_set": {"shop_money": {"amount": 59.0, "currency_code": "USD"}, "presentment_money": {"amount": 59.0, "currency_code": "USD"}}, "product_exists": true, "product_id": 6796226560189, "properties": [], "quantity": 1, "requires_shipping": false, "sku": "", "taxable": true, "title": "All Black Sneaker Right Foot", "total_discount": "0.00", "total_discount_set": {"shop_money": {"amount": 0.0, "currency_code": "USD"}, "presentment_money": {"amount": 0.0, "currency_code": "USD"}}, "variant_id": 40090597884093, "variant_inventory_management": "shopify", "variant_title": "ivory", "vendor": "Becker - Moore", "tax_lines": [], "duties": [], "discount_allocations": [{"amount": "1.77", "amount_set": {"shop_money": {"amount": "1.77", "currency_code": "USD"}, "presentment_money": {"amount": "1.77", "currency_code": "USD"}}, "discount_application_index": 0}]}], "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953793275} {"stream": "inventory_items", "data": {"id": 44871665713341, "country_code_of_origin": null, "harmonized_system_code": null, "province_code_of_origin": null, "updated_at": "2023-04-14T10:29:27+00:00", "created_at": "2023-04-14T10:29:27+00:00", "sku": "", "tracked": true, "requires_shipping": false, "admin_graphql_api_id": "gid://shopify/InventoryItem/44871665713341", "cost": 60.0, "country_harmonized_system_codes": [], "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953800805} {"stream": "inventory_items", "data": {"id": 45419395743933, "country_code_of_origin": "UA", "harmonized_system_code": "330510", "province_code_of_origin": null, "updated_at": "2023-12-11T10:37:41+00:00", "created_at": "2023-12-11T10:37:41+00:00", "sku": "123", "tracked": true, "requires_shipping": true, "admin_graphql_api_id": "gid://shopify/InventoryItem/45419395743933", "cost": 29.0, "country_harmonized_system_codes": [], "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953800806} -{"stream": "inventory_levels", "data": {"id": "63590301885|42185200631997", "available": 15, "updated_at": "2023-04-13T12:00:55+00:00", "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185200631997", "inventory_item_id": 42185200631997, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953807899} -{"stream": "inventory_levels", "data": {"id": "63590301885|42185218719933", "available": 8, "updated_at": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185218719933", "inventory_item_id": 42185218719933, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953807904} -{"stream": "inventory_levels", "data": {"id": "63590301885|43653688524989", "available": 0, "updated_at": "2023-04-24T18:00:10+00:00", "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=43653688524989", "inventory_item_id": 43653688524989, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953807905} +{"stream": "inventory_levels", "data": {"id": "63590301885|42185200631997", "updated_at": "2023-04-13T12:00:55+00:00", "quantities": [{"id": 97912455357, "name": "available", "quantity": 15, "updatedAt": "2023-04-13T12:00:55+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=available"}, {"id": 97912455357, "name": "incoming", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=incoming"}, {"id": 97912455357, "name": "committed", "quantity": 0, "updatedAt": "2022-03-17T10:05:08+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=committed"}, {"id": 97912455357, "name": "damaged", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=damaged"}, {"id": 97912455357, "name": "on_hand", "quantity": 15, "updatedAt": "2023-04-13T12:00:52+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=on_hand"}, {"id": 97912455357, "name": "quality_control", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=quality_control"}, {"id": 97912455357, "name": "reserved", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=reserved"}, {"id": 97912455357, "name": "safety_stock", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=safety_stock"}], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185200631997", "inventory_item_id": 42185200631997, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1716464698314} +{"stream": "inventory_levels", "data": {"id": "63590301885|42185218719933", "updated_at": "2023-04-13T12:09:45+00:00", "quantities": [{"id": 97912455357, "name": "available", "quantity": 8, "updatedAt": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=available"}, {"id": 97912455357, "name": "incoming", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=incoming"}, {"id": 97912455357, "name": "committed", "quantity": 2, "updatedAt": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=committed"}, {"id": 97912455357, "name": "damaged", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=damaged"}, {"id": 97912455357, "name": "on_hand", "quantity": 10, "updatedAt": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=on_hand"}, {"id": 97912455357, "name": "quality_control", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=quality_control"}, {"id": 97912455357, "name": "reserved", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=reserved"}, {"id": 97912455357, "name": "safety_stock", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=safety_stock"}], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185218719933", "inventory_item_id": 42185218719933, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1716464698458} +{"stream": "inventory_levels", "data": {"id": "63590301885|43653688524989", "updated_at": "2023-04-24T18:00:10+00:00", "quantities": [{"id": 97912455357, "name": "available", "quantity": 0, "updatedAt": "2023-04-24T18:00:10+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=available"}, {"id": 97912455357, "name": "incoming", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=incoming"}, {"id": 97912455357, "name": "committed", "quantity": 0, "updatedAt": "2023-04-24T18:00:09+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=committed"}, {"id": 97912455357, "name": "damaged", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=damaged"}, {"id": 97912455357, "name": "on_hand", "quantity": 0, "updatedAt": "2023-04-24T18:00:09+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=on_hand"}, {"id": 97912455357, "name": "quality_control", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=quality_control"}, {"id": 97912455357, "name": "reserved", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=reserved"}, {"id": 97912455357, "name": "safety_stock", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=safety_stock"}], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=43653688524989", "inventory_item_id": 43653688524989, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1716464698539} {"stream": "locations", "data": {"id": 63590301885, "name": "Heroiv UPA 72", "address1": "Heroiv UPA 72", "address2": "", "city": "Lviv", "zip": "30100", "province": null, "country": "UA", "phone": "", "created_at": "2021-06-22T18:00:29-07:00", "updated_at": "2023-11-28T07:08:27-08:00", "country_code": "UA", "country_name": "Ukraine", "province_code": null, "legacy": false, "active": true, "admin_graphql_api_id": "gid://shopify/Location/63590301885", "localized_country_name": "Ukraine", "localized_province_name": null, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953808895} {"stream": "metafield_articles", "data": {"id": 21519818162365, "namespace": "global", "key": "new", "value": "newvalue", "description": null, "owner_id": 558137508029, "created_at": "2022-10-07T16:09:02-07:00", "updated_at": "2022-10-07T16:09:02-07:00", "owner_resource": "article", "type": "single_line_text_field", "admin_graphql_api_id": "gid://shopify/Metafield/21519818162365", "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953810882} {"stream": "metafield_articles", "data": {"id": 22365709992125, "namespace": "custom", "key": "test_blog_post_metafield", "value": "Test Article Metafield", "description": null, "owner_id": 558137508029, "created_at": "2023-04-14T03:18:26-07:00", "updated_at": "2023-04-14T03:18:26-07:00", "owner_resource": "article", "type": "single_line_text_field", "admin_graphql_api_id": "gid://shopify/Metafield/22365709992125", "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953810884} diff --git a/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records_transactions_with_user_id.jsonl b/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records_transactions_with_user_id.jsonl index 1d38e79fe47d..823a60b917ca 100644 --- a/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records_transactions_with_user_id.jsonl +++ b/airbyte-integrations/connectors/source-shopify/integration_tests/expected_records_transactions_with_user_id.jsonl @@ -24,9 +24,9 @@ {"stream": "fulfillments", "data": {"id": 4075788501181, "admin_graphql_api_id": "gid://shopify/Fulfillment/4075788501181", "created_at": "2022-06-15T05:16:55-07:00", "location_id": 63590301885, "name": "#1136.1", "order_id": 4554821468349, "origin_address": {}, "receipt": {}, "service": "manual", "shipment_status": null, "status": "success", "tracking_company": null, "tracking_number": null, "tracking_numbers": [], "tracking_url": null, "tracking_urls": [], "updated_at": "2022-06-15T05:16:55-07:00", "line_items": [{"id": 11406125564093, "admin_graphql_api_id": "gid://shopify/LineItem/11406125564093", "fulfillable_quantity": 0, "fulfillment_service": "manual", "fulfillment_status": "fulfilled", "gift_card": false, "grams": 0, "name": "All Black Sneaker Right Foot - ivory", "price": "59.00", "price_set": {"shop_money": {"amount": 59.0, "currency_code": "USD"}, "presentment_money": {"amount": 59.0, "currency_code": "USD"}}, "product_exists": true, "product_id": 6796226560189, "properties": [], "quantity": 1, "requires_shipping": false, "sku": "", "taxable": true, "title": "All Black Sneaker Right Foot", "total_discount": "0.00", "total_discount_set": {"shop_money": {"amount": 0.0, "currency_code": "USD"}, "presentment_money": {"amount": 0.0, "currency_code": "USD"}}, "variant_id": 40090597884093, "variant_inventory_management": "shopify", "variant_title": "ivory", "vendor": "Becker - Moore", "tax_lines": [], "duties": [], "discount_allocations": [{"amount": "1.77", "amount_set": {"shop_money": {"amount": "1.77", "currency_code": "USD"}, "presentment_money": {"amount": "1.77", "currency_code": "USD"}}, "discount_application_index": 0}]}], "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953570027} {"stream": "inventory_items", "data": {"id": 44871665713341, "country_code_of_origin": null, "harmonized_system_code": null, "province_code_of_origin": null, "updated_at": "2023-04-14T10:29:27+00:00", "created_at": "2023-04-14T10:29:27+00:00", "sku": "", "tracked": true, "requires_shipping": false, "admin_graphql_api_id": "gid://shopify/InventoryItem/44871665713341", "cost": 60.0, "country_harmonized_system_codes": [], "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953577593} {"stream": "inventory_items", "data": {"id": 45419395743933, "country_code_of_origin": "UA", "harmonized_system_code": "330510", "province_code_of_origin": null, "updated_at": "2023-12-11T10:37:41+00:00", "created_at": "2023-12-11T10:37:41+00:00", "sku": "123", "tracked": true, "requires_shipping": true, "admin_graphql_api_id": "gid://shopify/InventoryItem/45419395743933", "cost": 29.0, "country_harmonized_system_codes": [], "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953577593} -{"stream": "inventory_levels", "data": {"id": "63590301885|42185200631997", "available": 15, "updated_at": "2023-04-13T12:00:55+00:00", "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185200631997", "inventory_item_id": 42185200631997, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953584675} -{"stream": "inventory_levels", "data": {"id": "63590301885|42185218719933", "available": 8, "updated_at": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185218719933", "inventory_item_id": 42185218719933, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953584677} -{"stream": "inventory_levels", "data": {"id": "63590301885|43653688524989", "available": 0, "updated_at": "2023-04-24T18:00:10+00:00", "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=43653688524989", "inventory_item_id": 43653688524989, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953584677} +{"stream": "inventory_levels", "data": {"id": "63590301885|42185200631997", "updated_at": "2023-04-13T12:00:55+00:00", "quantities": [{"id": 97912455357, "name": "available", "quantity": 15, "updatedAt": "2023-04-13T12:00:55+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=available"}, {"id": 97912455357, "name": "incoming", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=incoming"}, {"id": 97912455357, "name": "committed", "quantity": 0, "updatedAt": "2022-03-17T10:05:08+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=committed"}, {"id": 97912455357, "name": "damaged", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=damaged"}, {"id": 97912455357, "name": "on_hand", "quantity": 15, "updatedAt": "2023-04-13T12:00:52+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=on_hand"}, {"id": 97912455357, "name": "quality_control", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=quality_control"}, {"id": 97912455357, "name": "reserved", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=reserved"}, {"id": 97912455357, "name": "safety_stock", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=safety_stock"}], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185200631997", "inventory_item_id": 42185200631997, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1716464698314} +{"stream": "inventory_levels", "data": {"id": "63590301885|42185218719933", "updated_at": "2023-04-13T12:09:45+00:00", "quantities": [{"id": 97912455357, "name": "available", "quantity": 8, "updatedAt": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=available"}, {"id": 97912455357, "name": "incoming", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=incoming"}, {"id": 97912455357, "name": "committed", "quantity": 2, "updatedAt": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=committed"}, {"id": 97912455357, "name": "damaged", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=damaged"}, {"id": 97912455357, "name": "on_hand", "quantity": 10, "updatedAt": "2023-04-13T12:09:45+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=on_hand"}, {"id": 97912455357, "name": "quality_control", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=quality_control"}, {"id": 97912455357, "name": "reserved", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=reserved"}, {"id": 97912455357, "name": "safety_stock", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=safety_stock"}], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185218719933", "inventory_item_id": 42185218719933, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1716464698458} +{"stream": "inventory_levels", "data": {"id": "63590301885|43653688524989", "updated_at": "2023-04-24T18:00:10+00:00", "quantities": [{"id": 97912455357, "name": "available", "quantity": 0, "updatedAt": "2023-04-24T18:00:10+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=available"}, {"id": 97912455357, "name": "incoming", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=incoming"}, {"id": 97912455357, "name": "committed", "quantity": 0, "updatedAt": "2023-04-24T18:00:09+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=committed"}, {"id": 97912455357, "name": "damaged", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=damaged"}, {"id": 97912455357, "name": "on_hand", "quantity": 0, "updatedAt": "2023-04-24T18:00:09+00:00", "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=on_hand"}, {"id": 97912455357, "name": "quality_control", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=quality_control"}, {"id": 97912455357, "name": "reserved", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=reserved"}, {"id": 97912455357, "name": "safety_stock", "quantity": 0, "updatedAt": null, "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=43653688524989&name=safety_stock"}], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=43653688524989", "inventory_item_id": 43653688524989, "location_id": 63590301885, "shop_url": "airbyte-integration-test"}, "emitted_at": 1716464698539} {"stream": "locations", "data": {"id": 63590301885, "name": "Heroiv UPA 72", "address1": "Heroiv UPA 72", "address2": "", "city": "Lviv", "zip": "30100", "province": null, "country": "UA", "phone": "", "created_at": "2021-06-22T18:00:29-07:00", "updated_at": "2023-11-28T07:08:27-08:00", "country_code": "UA", "country_name": "Ukraine", "province_code": null, "legacy": false, "active": true, "admin_graphql_api_id": "gid://shopify/Location/63590301885", "localized_country_name": "Ukraine", "localized_province_name": null, "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953585688} {"stream": "metafield_articles", "data": {"id": 21519818162365, "namespace": "global", "key": "new", "value": "newvalue", "description": null, "owner_id": 558137508029, "created_at": "2022-10-07T16:09:02-07:00", "updated_at": "2022-10-07T16:09:02-07:00", "owner_resource": "article", "type": "single_line_text_field", "admin_graphql_api_id": "gid://shopify/Metafield/21519818162365", "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953587648} {"stream": "metafield_articles", "data": {"id": 22365709992125, "namespace": "custom", "key": "test_blog_post_metafield", "value": "Test Article Metafield", "description": null, "owner_id": 558137508029, "created_at": "2023-04-14T03:18:26-07:00", "updated_at": "2023-04-14T03:18:26-07:00", "owner_resource": "article", "type": "single_line_text_field", "admin_graphql_api_id": "gid://shopify/Metafield/22365709992125", "shop_url": "airbyte-integration-test"}, "emitted_at": 1708953587649} diff --git a/airbyte-integrations/connectors/source-shopify/metadata.yaml b/airbyte-integrations/connectors/source-shopify/metadata.yaml index 2841e5f30174..508ed170e6dc 100644 --- a/airbyte-integrations/connectors/source-shopify/metadata.yaml +++ b/airbyte-integrations/connectors/source-shopify/metadata.yaml @@ -11,7 +11,7 @@ data: connectorSubtype: api connectorType: source definitionId: 9da77001-af33-4bcd-be46-6252bf9342b9 - dockerImageTag: 2.1.3 + dockerImageTag: 2.1.4 dockerRepository: airbyte/source-shopify documentationUrl: https://docs.airbyte.com/integrations/sources/shopify githubIssueLabel: source-shopify diff --git a/airbyte-integrations/connectors/source-shopify/pyproject.toml b/airbyte-integrations/connectors/source-shopify/pyproject.toml index 134329f6d943..3aa0e6065a69 100644 --- a/airbyte-integrations/connectors/source-shopify/pyproject.toml +++ b/airbyte-integrations/connectors/source-shopify/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] -version = "2.1.3" +version = "2.1.4" name = "source-shopify" description = "Source CDK implementation for Shopify." authors = [ "Airbyte ",] diff --git a/airbyte-integrations/connectors/source-shopify/source_shopify/schemas/inventory_levels.json b/airbyte-integrations/connectors/source-shopify/source_shopify/schemas/inventory_levels.json index cb17561e7a8a..2366cc083b5f 100644 --- a/airbyte-integrations/connectors/source-shopify/source_shopify/schemas/inventory_levels.json +++ b/airbyte-integrations/connectors/source-shopify/source_shopify/schemas/inventory_levels.json @@ -30,6 +30,31 @@ "shop_url": { "description": "The URL of the shop where the inventory belongs.", "type": ["null", "string"] + }, + "quantities": { + "description": "The quantities of items available for sale in the inventory.", + "type": ["null", "array"], + "items": { + "type": ["null", "object"], + "properties": { + "id": { + "type": ["null", "integer"] + }, + "name": { + "type": ["null", "string"] + }, + "quantity": { + "type": ["null", "integer"] + }, + "updatedAt": { + "type": ["null", "string"], + "format": "date-time" + }, + "admin_graphql_api_id": { + "type": ["null", "string"] + } + } + } } } } diff --git a/airbyte-integrations/connectors/source-shopify/source_shopify/shopify_graphql/bulk/query.py b/airbyte-integrations/connectors/source-shopify/source_shopify/shopify_graphql/bulk/query.py index f35ac1ce0066..c523c9d7388f 100644 --- a/airbyte-integrations/connectors/source-shopify/source_shopify/shopify_graphql/bulk/query.py +++ b/airbyte-integrations/connectors/source-shopify/source_shopify/shopify_graphql/bulk/query.py @@ -742,7 +742,7 @@ class Collection(ShopifyBulkQuery): Field(name="publications", fields=publications_fields), Field(name="sortOrder"), Field(name="templateSuffix"), - Field(name="productsCount"), + Field(name="productsCount", fields=[Field(name="count", alias="products_count")]), ] record_composition = { @@ -764,6 +764,8 @@ def record_process_components(self, record: MutableMapping[str, Any]) -> Iterabl # convert dates from ISO-8601 to RFC-3339 record["published_at"] = self.tools.from_iso8601_to_rfc3339(record, "published_at") record["updatedAt"] = self.tools.from_iso8601_to_rfc3339(record, "updatedAt") + # unnest `product_count` to the root lvl + record["products_count"] = record.get("productsCount", {}).get("products_count") # remove leftovers record.pop(BULK_PARENT_KEY, None) yield record @@ -988,17 +990,60 @@ class InventoryLevel(ShopifyBulkQuery): "new_record": "InventoryLevel", } + # quantity related fields and filtering options + quantities_names_filter: List[str] = [ + '"available"', + '"incoming"', + '"committed"', + '"damaged"', + '"on_hand"', + '"quality_control"', + '"reserved"', + '"safety_stock"', + ] + # quantities fields + quantities_fields: List[str] = [ + "id", + "name", + "quantity", + "updatedAt", + ] + inventory_levels_fields: List[Field] = [ "__typename", "id", - Field(name="available"), Field(name="item", fields=[Field(name="id", alias="inventory_item_id")]), Field(name="updatedAt"), ] + def _quantities_query(self) -> Query: + """ + Defines the `quantities` nested query. + """ + + return Query( + name="quantities", + arguments=[Argument(name="names", value=self.quantities_names_filter)], + fields=self.quantities_fields, + ) + + def _process_quantities(self, quantities: Iterable[MutableMapping[str, Any]] = None) -> Iterable[Mapping[str, Any]]: + if quantities: + for quantity in quantities: + # save the original string id + quantity["admin_graphql_api_id"] = quantity.get("id") + # resolve the int id from str id + quantity["id"] = self.tools.resolve_str_id(quantity.get("id")) + # convert dates from ISO-8601 to RFC-3339 + quantity["updatedAt"] = self.tools.from_iso8601_to_rfc3339(quantity, "updatedAt") + return quantities + return [] + def query(self, filter_query: Optional[str] = None) -> Query: + # construct the `quantities` query piece + quantities: List[Query] = [self._quantities_query()] # build the nested query first with `filter_query` to have the incremental syncs - inventory_levels: List[Query] = [self.build("inventoryLevels", self.inventory_levels_fields, filter_query)] + inventory_levels: List[Query] = [self.build("inventoryLevels", self.inventory_levels_fields + quantities, filter_query)] # build the main query around previous # return the constructed query operation return self.build( @@ -1012,7 +1057,9 @@ def record_process_components(self, record: MutableMapping[str, Any]) -> Iterabl """ Defines how to process collected components. """ - + # process quantities + quantities = record.get("quantities", []) + record["quantities"] = self._process_quantities(quantities) # resolve `inventory_item_id` to root lvl + resolve to int record["inventory_item_id"] = self.tools.resolve_str_id(record.get("item", {}).get("inventory_item_id")) # add `location_id` from `__parentId` diff --git a/airbyte-integrations/connectors/source-shopify/source_shopify/streams/base_streams.py b/airbyte-integrations/connectors/source-shopify/source_shopify/streams/base_streams.py index d5b85a991369..bc084f3c482b 100644 --- a/airbyte-integrations/connectors/source-shopify/source_shopify/streams/base_streams.py +++ b/airbyte-integrations/connectors/source-shopify/source_shopify/streams/base_streams.py @@ -28,7 +28,7 @@ class ShopifyStream(HttpStream, ABC): logger = logging.getLogger("airbyte") # Latest Stable Release - api_version = "2023-07" + api_version = "2024-04" # Page size limit = 250 diff --git a/airbyte-integrations/connectors/source-shopify/source_shopify/streams/streams.py b/airbyte-integrations/connectors/source-shopify/source_shopify/streams/streams.py index 089cf2e51e3e..51594e6353bb 100644 --- a/airbyte-integrations/connectors/source-shopify/source_shopify/streams/streams.py +++ b/airbyte-integrations/connectors/source-shopify/source_shopify/streams/streams.py @@ -115,7 +115,6 @@ class MetafieldDraftOrders(IncrementalShopifyGraphQlBulkStream): class Products(IncrementalShopifyGraphQlBulkStream): bulk_query: Product = Product # pin the api version - api_version = "2024-04" class ProductsGraphQl(IncrementalShopifyStream): @@ -123,6 +122,8 @@ class ProductsGraphQl(IncrementalShopifyStream): cursor_field = "updatedAt" data_field = "graphql" http_method = "POST" + # pin the old api_version before this stream is deprecated + api_version = "2023-07" def request_params( self, @@ -263,7 +264,6 @@ class OrderRefunds(IncrementalShopifyNestedStream): class OrderRisks(IncrementalShopifyGraphQlBulkStream): bulk_query: OrderRisk = OrderRisk # the updated stream work only with >= `2024-04` shopify api version - api_version = "2024-04" class Transactions(IncrementalShopifySubstream): diff --git a/airbyte-integrations/connectors/source-shopify/unit_tests/conftest.py b/airbyte-integrations/connectors/source-shopify/unit_tests/conftest.py index 94335b3f793d..a627ced549fd 100644 --- a/airbyte-integrations/connectors/source-shopify/unit_tests/conftest.py +++ b/airbyte-integrations/connectors/source-shopify/unit_tests/conftest.py @@ -557,8 +557,8 @@ def customer_address_jsonl_content_example(): @pytest.fixture def inventory_levels_jsonl_content_example(): return """{"__typename":"Location","id":"gid:\/\/shopify\/Location\/63590301885"} -{"__typename":"InventoryLevel","id":"gid:\/\/shopify\/InventoryLevel\/97912455357?inventory_item_id=42185200631997","available":15,"item":{"inventory_item_id":"gid:\/\/shopify\/InventoryItem\/42185200631997"},"updatedAt":"2023-04-13T12:00:55Z","__parentId":"gid:\/\/shopify\/Location\/63590301885"} -{"__typename":"InventoryLevel","id":"gid:\/\/shopify\/InventoryLevel\/97912455357?inventory_item_id=42185218719933","available":8,"item":{"inventory_item_id":"gid:\/\/shopify\/InventoryItem\/42185218719933"},"updatedAt":"2023-04-13T12:09:45Z","__parentId":"gid:\/\/shopify\/Location\/63590301885"}\n""" +{"__typename":"InventoryLevel","id":"gid:\/\/shopify\/InventoryLevel\/97912455357?inventory_item_id=42185200631997","item":{"inventory_item_id":"gid:\/\/shopify\/InventoryItem\/42185200631997"},"updatedAt":"2023-04-13T12:00:55Z","quantities":[{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=available","name":"available","quantity":15,"updatedAt":"2023-04-13T12:00:55Z"},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=incoming","name":"incoming","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=committed","name":"committed","quantity":0,"updatedAt":"2022-03-17T10:05:08Z"},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=damaged","name":"damaged","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=on_hand","name":"on_hand","quantity":15,"updatedAt":"2023-04-13T12:00:52Z"},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=quality_control","name":"quality_control","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=reserved","name":"reserved","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185200631997\u0026name=safety_stock","name":"safety_stock","quantity":0,"updatedAt":null}],"__parentId":"gid:\/\/shopify\/Location\/63590301885"} +{"__typename":"InventoryLevel","id":"gid:\/\/shopify\/InventoryLevel\/97912455357?inventory_item_id=42185218719933","item":{"inventory_item_id":"gid:\/\/shopify\/InventoryItem\/42185218719933"},"updatedAt":"2023-04-13T12:09:45Z","quantities":[{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=available","name":"available","quantity":8,"updatedAt":"2023-04-13T12:09:45Z"},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=incoming","name":"incoming","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=committed","name":"committed","quantity":2,"updatedAt":"2023-04-13T12:09:45Z"},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=damaged","name":"damaged","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=on_hand","name":"on_hand","quantity":10,"updatedAt":"2023-04-13T12:09:45Z"},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=quality_control","name":"quality_control","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=reserved","name":"reserved","quantity":0,"updatedAt":null},{"id":"gid:\/\/shopify\/InventoryQuantity\/97912455357?inventory_item_id=42185218719933\u0026name=safety_stock","name":"safety_stock","quantity":0,"updatedAt":null}],"__parentId":"gid:\/\/shopify\/Location\/63590301885"}\n""" @pytest.fixture @@ -570,11 +570,11 @@ def discount_codes_jsonl_content_example(): @pytest.fixture def collections_jsonl_content_example(): - return """{"__typename":"Collection","id":"gid:\/\/shopify\/Collection\/270889287869","handle":"frontpage","title":"Home page","updatedAt":"2023-09-05T14:06:59Z","bodyHtml":"updated_mon_24.04.2023","sortOrder":"BEST_SELLING","templateSuffix":"","productsCount":1} + return """{"__typename":"Collection","id":"gid:\/\/shopify\/Collection\/270889287869","handle":"frontpage","title":"Home page","updatedAt":"2023-09-05T14:06:59Z","bodyHtml":"updated_mon_24.04.2023","sortOrder":"BEST_SELLING","templateSuffix":"","productsCount":{"products_count": 1}} {"__typename":"CollectionPublication","publishedAt":"2021-06-23T01:00:25Z","__parentId":"gid:\/\/shopify\/Collection\/270889287869"} {"__typename":"CollectionPublication","publishedAt":"2021-08-18T09:39:34Z","__parentId":"gid:\/\/shopify\/Collection\/270889287869"} {"__typename":"CollectionPublication","publishedAt":"2023-04-20T11:12:24Z","__parentId":"gid:\/\/shopify\/Collection\/270889287869"} -{"__typename":"Collection","id":"gid:\/\/shopify\/Collection\/273278566589","handle":"test-collection","title":"Test Collection","updatedAt":"2023-09-05T14:12:04Z","bodyHtml":"updated_mon_24.04.2023","sortOrder":"BEST_SELLING","templateSuffix":"","productsCount":26} +{"__typename":"Collection","id":"gid:\/\/shopify\/Collection\/273278566589","handle":"test-collection","title":"Test Collection","updatedAt":"2023-09-05T14:12:04Z","bodyHtml":"updated_mon_24.04.2023","sortOrder":"BEST_SELLING","templateSuffix":"","productsCount":{"products_count": 26}} {"__typename":"CollectionPublication","publishedAt":"2021-07-19T14:02:54Z","__parentId":"gid:\/\/shopify\/Collection\/273278566589"} {"__typename":"CollectionPublication","publishedAt":"2021-08-18T09:39:34Z","__parentId":"gid:\/\/shopify\/Collection\/273278566589"} {"__typename":"CollectionPublication","publishedAt":"2023-04-20T11:12:24Z","__parentId":"gid:\/\/shopify\/Collection\/273278566589"}\n""" @@ -1041,22 +1041,136 @@ def inventory_levels_response_expected_result(): return [ { "id": "63590301885|42185200631997", - "available": 15, "updated_at": "2023-04-13T12:00:55+00:00", + "quantities": [ + { + "id": 97912455357, + "name": "available", + "quantity": 15, + "updatedAt": "2023-04-13T12:00:55+00:00", + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=available" + }, + { + "id": 97912455357, + "name": "incoming", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=incoming" + }, + { + "id": 97912455357, + "name": "committed", + "quantity": 0, + "updatedAt": "2022-03-17T10:05:08+00:00", + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=committed" + }, + { + "id": 97912455357, + "name": "damaged", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=damaged" + }, + { + "id": 97912455357, + "name": "on_hand", + "quantity": 15, + "updatedAt": "2023-04-13T12:00:52+00:00", + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=on_hand" + }, + { + "id": 97912455357, + "name": "quality_control", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=quality_control" + }, + { + "id": 97912455357, + "name": "reserved", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=reserved" + }, + { + "id": 97912455357, + "name": "safety_stock", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185200631997&name=safety_stock" + } + ], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185200631997", "inventory_item_id": 42185200631997, "location_id": 63590301885, - "shop_url": "test_shop", + "shop_url": "test_shop" }, { "id": "63590301885|42185218719933", - "available": 8, "updated_at": "2023-04-13T12:09:45+00:00", + "quantities": [ + { + "id": 97912455357, + "name": "available", + "quantity": 8, + "updatedAt": "2023-04-13T12:09:45+00:00", + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=available" + }, + { + "id": 97912455357, + "name": "incoming", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=incoming" + }, + { + "id": 97912455357, + "name": "committed", + "quantity": 2, + "updatedAt": "2023-04-13T12:09:45+00:00", + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=committed" + }, + { + "id": 97912455357, + "name": "damaged", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=damaged" + }, + { + "id": 97912455357, + "name": "on_hand", + "quantity": 10, + "updatedAt": "2023-04-13T12:09:45+00:00", + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=on_hand" + }, + { + "id": 97912455357, + "name": "quality_control", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=quality_control" + }, + { + "id": 97912455357, + "name": "reserved", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=reserved" + }, + { + "id": 97912455357, + "name": "safety_stock", + "quantity": 0, + "updatedAt": None, + "admin_graphql_api_id": "gid://shopify/InventoryQuantity/97912455357?inventory_item_id=42185218719933&name=safety_stock" + } + ], "admin_graphql_api_id": "gid://shopify/InventoryLevel/97912455357?inventory_item_id=42185218719933", "inventory_item_id": 42185218719933, "location_id": 63590301885, - "shop_url": "test_shop", - }, + "shop_url": "test_shop" + } ] diff --git a/airbyte-integrations/connectors/source-shopify/unit_tests/graphql_bulk/test_query.py b/airbyte-integrations/connectors/source-shopify/unit_tests/graphql_bulk/test_query.py index a63e521ef6b1..570969dd8f24 100644 --- a/airbyte-integrations/connectors/source-shopify/unit_tests/graphql_bulk/test_query.py +++ b/airbyte-integrations/connectors/source-shopify/unit_tests/graphql_bulk/test_query.py @@ -201,9 +201,20 @@ def test_base_build_query(query_name, fields, filter_field, start, end, expected fields=[ "__typename", "id", - Field(name="available"), Field(name="item", fields=[Field(name="id", alias="inventory_item_id")]), - Field(name="updatedAt") + Field(name="updatedAt"), + Query( + name="quantities", + arguments=[ + Argument(name="names", value=['"available"', '"incoming"', '"committed"', '"damaged"', '"on_hand"', '"quality_control"', '"reserved"', '"safety_stock"']) + ], + fields=[ + "id", + "name", + "quantity", + "updatedAt", + ], + ) ] ) ] diff --git a/docs/integrations/sources/shopify.md b/docs/integrations/sources/shopify.md index 27c56fe768e4..f79451aada3b 100644 --- a/docs/integrations/sources/shopify.md +++ b/docs/integrations/sources/shopify.md @@ -208,6 +208,7 @@ For all `Shopify GraphQL BULK` api requests these limitations are applied: https | Version | Date | Pull Request | Subject | | :------ | :--------- | :------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2.1.4 | 2024-05-24 | [38610](https://github.com/airbytehq/airbyte/pull/38610) | Updated the source `API Version` to `2024-04` | | 2.1.3 | 2024-05-23 | [38464](https://github.com/airbytehq/airbyte/pull/38464) | Added missing fields to `Products` stream | | 2.1.2 | 2024-05-23 | [38352](https://github.com/airbytehq/airbyte/pull/38352) | Migrated `Order Risks` stream to `GraphQL BULK` | | 2.1.1 | 2024-05-20 | [38251](https://github.com/airbytehq/airbyte/pull/38251) | Replace AirbyteLogger with logging.Logger |