airbyte-source-shopify 3.1.2__tar.gz → 3.1.2.dev202601082220__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.
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/PKG-INFO +1 -1
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/pyproject.toml +1 -1
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/source.py +0 -3
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/spec.json +9 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/streams/base_streams.py +26 -1
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/README.md +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/__init__.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/auth.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/config_migrations.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/http_request.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/run.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/abandoned_checkouts.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/articles.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/balance_transactions.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/blogs.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/collections.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/collects.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/countries.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/custom_collections.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/customer_address.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/customer_journey_summary.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/customers.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/deleted_products.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/discount_codes.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/disputes.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/draft_orders.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/fulfillment_orders.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/fulfillments.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/inventory_items.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/inventory_levels.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/locations.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_articles.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_blogs.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_collections.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_customers.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_draft_orders.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_locations.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_orders.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_pages.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_product_images.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_product_variants.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_products.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_shops.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/metafield_smart_collections.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/order_agreements.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/order_refunds.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/order_risks.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/orders.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/pages.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/price_rules.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/product_images.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/product_variants.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/products.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/profile_location_groups.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/shop.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/smart_collections.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/tender_transactions.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/schemas/transactions.json +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/scopes.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/__init__.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/exceptions.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/job.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/query.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/record.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/retry.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/status.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/shopify_graphql/bulk/tools.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/streams/streams.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/transform.py +0 -0
- {airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/utils.py +0 -0
{airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/pyproject.toml
RENAMED
|
@@ -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.1.2"
|
|
6
|
+
version = "3.1.2.dev.202601082220"
|
|
7
7
|
name = "airbyte-source-shopify"
|
|
8
8
|
description = "Source CDK implementation for Shopify."
|
|
9
9
|
authors = [ "Airbyte <contact@airbyte.io>",]
|
|
@@ -11,7 +11,6 @@ from requests.exceptions import ConnectionError, RequestException, SSLError
|
|
|
11
11
|
from airbyte_cdk.models import FailureType, SyncMode
|
|
12
12
|
from airbyte_cdk.sources import AbstractSource
|
|
13
13
|
from airbyte_cdk.sources.streams import Stream
|
|
14
|
-
from airbyte_cdk.sources.streams.http.exceptions import BaseBackoffException
|
|
15
14
|
from airbyte_cdk.utils import AirbyteTracedException
|
|
16
15
|
|
|
17
16
|
from .auth import MissingAccessTokenError, ShopifyAuthenticator
|
|
@@ -109,8 +108,6 @@ class ConnectionCheckTest:
|
|
|
109
108
|
return False, self.describe_error("index_error", shop_name, response)
|
|
110
109
|
except MissingAccessTokenError:
|
|
111
110
|
return False, self.describe_error("missing_token_error")
|
|
112
|
-
except (BaseBackoffException, AirbyteTracedException) as error:
|
|
113
|
-
return False, self.describe_error("connection_error", shop_name) or str(error)
|
|
114
111
|
|
|
115
112
|
def get_shop_id(self) -> str:
|
|
116
113
|
"""
|
|
@@ -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
|
-
|
|
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:
|
|
File without changes
|
|
File without changes
|
{airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/auth.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{airbyte_source_shopify-3.1.2 → airbyte_source_shopify-3.1.2.dev202601082220}/source_shopify/run.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|