airbyte-source-shopify 3.0.13.dev202512232215__tar.gz → 3.0.13.dev202512261812__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/PKG-INFO +1 -1
  2. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/pyproject.toml +1 -1
  3. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/spec.json +9 -0
  4. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/streams/base_streams.py +26 -1
  5. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/streams/streams.py +1 -4
  6. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/README.md +0 -0
  7. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/__init__.py +0 -0
  8. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/auth.py +0 -0
  9. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/config_migrations.py +0 -0
  10. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/http_request.py +0 -0
  11. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/run.py +0 -0
  12. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/abandoned_checkouts.json +0 -0
  13. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/articles.json +0 -0
  14. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/balance_transactions.json +0 -0
  15. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/blogs.json +0 -0
  16. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/collections.json +0 -0
  17. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/collects.json +0 -0
  18. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/countries.json +0 -0
  19. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/custom_collections.json +0 -0
  20. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/customer_address.json +0 -0
  21. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/customer_journey_summary.json +0 -0
  22. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/customers.json +0 -0
  23. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/discount_codes.json +0 -0
  24. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/disputes.json +0 -0
  25. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/draft_orders.json +0 -0
  26. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/fulfillment_orders.json +0 -0
  27. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/fulfillments.json +0 -0
  28. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/inventory_items.json +0 -0
  29. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/inventory_levels.json +0 -0
  30. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/locations.json +0 -0
  31. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_articles.json +0 -0
  32. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_blogs.json +0 -0
  33. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_collections.json +0 -0
  34. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_customers.json +0 -0
  35. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_draft_orders.json +0 -0
  36. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_locations.json +0 -0
  37. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_orders.json +0 -0
  38. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_pages.json +0 -0
  39. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_product_images.json +0 -0
  40. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_product_variants.json +0 -0
  41. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_products.json +0 -0
  42. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_shops.json +0 -0
  43. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/metafield_smart_collections.json +0 -0
  44. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/order_agreements.json +0 -0
  45. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/order_refunds.json +0 -0
  46. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/order_risks.json +0 -0
  47. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/orders.json +0 -0
  48. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/pages.json +0 -0
  49. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/price_rules.json +0 -0
  50. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/product_images.json +0 -0
  51. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/product_variants.json +0 -0
  52. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/products.json +0 -0
  53. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/profile_location_groups.json +0 -0
  54. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/shop.json +0 -0
  55. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/smart_collections.json +0 -0
  56. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/tender_transactions.json +0 -0
  57. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/schemas/transactions.json +0 -0
  58. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/scopes.py +0 -0
  59. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/__init__.py +0 -0
  60. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/exceptions.py +0 -0
  61. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/job.py +0 -0
  62. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/query.py +0 -0
  63. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/record.py +0 -0
  64. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/retry.py +0 -0
  65. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/status.py +0 -0
  66. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/shopify_graphql/bulk/tools.py +0 -0
  67. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/source.py +0 -0
  68. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/transform.py +0 -0
  69. {airbyte_source_shopify-3.0.13.dev202512232215 → airbyte_source_shopify-3.0.13.dev202512261812}/source_shopify/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-source-shopify
3
- Version: 3.0.13.dev202512232215
3
+ Version: 3.0.13.dev202512261812
4
4
  Summary: Source CDK implementation for Shopify.
5
5
  Home-page: https://airbyte.com
6
6
  License: ELv2
@@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",]
3
3
  build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
- version = "3.0.13.dev.202512232215"
6
+ version = "3.0.13.dev.202512261812"
7
7
  name = "airbyte-source-shopify"
8
8
  description = "Source CDK implementation for Shopify."
9
9
  authors = [ "Airbyte <contact@airbyte.io>",]
@@ -119,6 +119,15 @@
119
119
  "default": 100000,
120
120
  "minimum": 15000,
121
121
  "maximum": 1000000
122
+ },
123
+ "lookback_window_in_days": {
124
+ "type": "integer",
125
+ "title": "Lookback Window (in days)",
126
+ "description": "The number of days to look back for records that may have been missed due to race conditions or late-arriving data. This is useful for ensuring data completeness in incremental syncs. Setting this to 1 or more will re-fetch records from the specified number of days before the last sync state.",
127
+ "default": 0,
128
+ "minimum": 0,
129
+ "maximum": 30,
130
+ "order": 7
122
131
  }
123
132
  }
124
133
  },
@@ -209,6 +209,24 @@ class IncrementalShopifyStream(ShopifyStream, ABC):
209
209
  current_state_value = current_stream_state.get(self.cursor_field) or self.default_state_comparison_value
210
210
  return {self.cursor_field: max(last_record_value, current_state_value)}
211
211
 
212
+ def _apply_lookback_window(self, state_value: str) -> str:
213
+ """
214
+ Apply the lookback window to the state value by subtracting the configured number of days.
215
+ This helps capture records that may have been missed due to race conditions or late-arriving data.
216
+ """
217
+ lookback_days = self.config.get("lookback_window_in_days", 0)
218
+ if lookback_days > 0:
219
+ state_datetime = pdm.parse(state_value)
220
+ adjusted_datetime = state_datetime.subtract(days=lookback_days)
221
+ # Ensure we don't go before the configured start_date
222
+ start_date = self.config.get("start_date")
223
+ if start_date:
224
+ start_datetime = pdm.parse(start_date)
225
+ if adjusted_datetime < start_datetime:
226
+ adjusted_datetime = start_datetime
227
+ return adjusted_datetime.to_rfc3339_string()
228
+ return state_value
229
+
212
230
  @stream_state_cache.cache_stream_state
213
231
  def request_params(
214
232
  self, stream_state: Optional[Mapping[str, Any]] = None, next_page_token: Optional[Mapping[str, Any]] = None, **kwargs
@@ -218,7 +236,11 @@ class IncrementalShopifyStream(ShopifyStream, ABC):
218
236
  if not next_page_token:
219
237
  params["order"] = f"{self.order_field} asc"
220
238
  if stream_state:
221
- params[self.filter_field] = stream_state.get(self.cursor_field)
239
+ state_value = stream_state.get(self.cursor_field)
240
+ # Apply lookback window to go back N days from the state
241
+ if state_value and self.filter_field != "since_id":
242
+ state_value = self._apply_lookback_window(state_value)
243
+ params[self.filter_field] = state_value
222
244
  return params
223
245
 
224
246
  def track_checkpoint_cursor(self, record_value: Union[str, int], filter_record_value: Optional[str] = None) -> None:
@@ -822,6 +844,9 @@ class IncrementalShopifyGraphQlBulkStream(IncrementalShopifyStream):
822
844
  def stream_slices(self, stream_state: Optional[Mapping[str, Any]] = None, **kwargs) -> Iterable[Optional[Mapping[str, Any]]]:
823
845
  if self.filter_field:
824
846
  state = self._get_state_value(stream_state)
847
+ # Apply lookback window only when we have a stream state (not on first sync)
848
+ if stream_state:
849
+ state = self._apply_lookback_window(state)
825
850
  start = pdm.parse(state)
826
851
  end = pdm.now()
827
852
  while start < end:
@@ -407,10 +407,7 @@ class Countries(HttpSubStream, FullRefreshShopifyGraphQlBulkStream):
407
407
  stream_slice: Optional[Mapping[str, Any]] = None,
408
408
  next_page_token: Optional[Mapping[str, Any]] = None,
409
409
  ) -> Optional[Mapping[str, Any]]:
410
- profile_location_groups = stream_slice["parent"]["profile_location_groups"]
411
- if not profile_location_groups:
412
- return None
413
- location_group_id = profile_location_groups[0]["locationGroup"]["id"]
410
+ location_group_id = stream_slice["parent"]["profile_location_groups"][0]["locationGroup"]["id"]
414
411
  return {
415
412
  "query": self.query(location_group_id=location_group_id, location_group_zones_cursor=self._sub_page_cursor).get(
416
413
  query_args={