airbyte-agent-shopify 0.1.9__tar.gz → 0.1.11__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 (61) hide show
  1. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/AUTH.md +1 -1
  2. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/CHANGELOG.md +10 -0
  3. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/PKG-INFO +4 -4
  4. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/README.md +3 -3
  5. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/__init__.py +4 -4
  6. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/connector_model_loader.py +54 -0
  7. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/pyproject.toml +1 -1
  8. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/.gitignore +0 -0
  9. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/REFERENCE.md +0 -0
  10. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/__init__.py +0 -0
  11. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/__init__.py +0 -0
  12. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/auth_strategies.py +0 -0
  13. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/auth_template.py +0 -0
  14. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
  15. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/cloud_utils/client.py +0 -0
  16. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/constants.py +0 -0
  17. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/exceptions.py +0 -0
  18. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/executor/__init__.py +0 -0
  19. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
  20. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/executor/local_executor.py +0 -0
  21. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/executor/models.py +0 -0
  22. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/extensions.py +0 -0
  23. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/__init__.py +0 -0
  24. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
  25. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
  26. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/config.py +0 -0
  27. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/exceptions.py +0 -0
  28. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/protocols.py +0 -0
  29. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http/response.py +0 -0
  30. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/http_client.py +0 -0
  31. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/introspection.py +0 -0
  32. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/logging/__init__.py +0 -0
  33. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/logging/logger.py +0 -0
  34. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/logging/types.py +0 -0
  35. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/observability/__init__.py +0 -0
  36. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/observability/config.py +0 -0
  37. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/observability/models.py +0 -0
  38. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/observability/redactor.py +0 -0
  39. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/observability/session.py +0 -0
  40. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/performance/__init__.py +0 -0
  41. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/performance/instrumentation.py +0 -0
  42. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/performance/metrics.py +0 -0
  43. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/__init__.py +0 -0
  44. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/base.py +0 -0
  45. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/components.py +0 -0
  46. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/connector.py +0 -0
  47. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/extensions.py +0 -0
  48. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/operations.py +0 -0
  49. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/schema/security.py +0 -0
  50. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/secrets.py +0 -0
  51. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/telemetry/__init__.py +0 -0
  52. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/telemetry/config.py +0 -0
  53. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/telemetry/events.py +0 -0
  54. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/telemetry/tracker.py +0 -0
  55. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/types.py +0 -0
  56. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/utils.py +0 -0
  57. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/_vendored/connector_sdk/validation.py +0 -0
  58. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/connector.py +0 -0
  59. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/connector_model.py +0 -0
  60. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/models.py +50 -50
  61. {airbyte_agent_shopify-0.1.9 → airbyte_agent_shopify-0.1.11}/airbyte_agent_shopify/types.py +0 -0
@@ -65,7 +65,7 @@ After creating the connector, execute operations using either the Python SDK or
65
65
  from airbyte_agent_shopify import ShopifyConnector
66
66
 
67
67
  connector = ShopifyConnector(
68
- external_user_id="<your-scoped-token>",
68
+ external_user_id="<your_external_user_id>",
69
69
  airbyte_client_id="<your-client-id>",
70
70
  airbyte_client_secret="<your-client-secret>"
71
71
  )
@@ -1,5 +1,15 @@
1
1
  # Shopify changelog
2
2
 
3
+ ## [0.1.11] - 2026-01-26
4
+ - Updated connector definition (YAML version 0.1.1)
5
+ - Source commit: 74809153
6
+ - SDK version: 0.1.0
7
+
8
+ ## [0.1.10] - 2026-01-26
9
+ - Updated connector definition (YAML version 0.1.1)
10
+ - Source commit: b73c71e0
11
+ - SDK version: 0.1.0
12
+
3
13
  ## [0.1.9] - 2026-01-24
4
14
  - Updated connector definition (YAML version 0.1.1)
5
15
  - Source commit: 609c1d86
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-shopify
3
- Version: 0.1.9
3
+ Version: 0.1.11
4
4
  Summary: Airbyte Shopify Connector for AI platforms
5
5
  Project-URL: Homepage, https://github.com/airbytehq/airbyte-agent-connectors
6
6
  Project-URL: Documentation, https://docs.airbyte.com/ai-agents/
@@ -108,7 +108,7 @@ This example assumes you've already authenticated your connector with Airbyte. S
108
108
  from airbyte_agent_shopify import ShopifyConnector
109
109
 
110
110
  connector = ShopifyConnector(
111
- external_user_id="<your-scoped-token>",
111
+ external_user_id="<your_external_user_id>",
112
112
  airbyte_client_id="<your-client-id>",
113
113
  airbyte_client_secret="<your-client-secret>"
114
114
  )
@@ -168,6 +168,6 @@ For the service's official API docs, see the [Shopify API reference](https://sho
168
168
 
169
169
  ## Version information
170
170
 
171
- - **Package version:** 0.1.9
171
+ - **Package version:** 0.1.11
172
172
  - **Connector version:** 0.1.1
173
- - **Generated with Connector SDK commit SHA:** 609c1d86c76b36ff699b57123a5a8c2050d958c3
173
+ - **Generated with Connector SDK commit SHA:** 74809153299f81ed3e220538146012ee2abd2e0d
@@ -75,7 +75,7 @@ This example assumes you've already authenticated your connector with Airbyte. S
75
75
  from airbyte_agent_shopify import ShopifyConnector
76
76
 
77
77
  connector = ShopifyConnector(
78
- external_user_id="<your-scoped-token>",
78
+ external_user_id="<your_external_user_id>",
79
79
  airbyte_client_id="<your-client-id>",
80
80
  airbyte_client_secret="<your-client-secret>"
81
81
  )
@@ -135,6 +135,6 @@ For the service's official API docs, see the [Shopify API reference](https://sho
135
135
 
136
136
  ## Version information
137
137
 
138
- - **Package version:** 0.1.9
138
+ - **Package version:** 0.1.11
139
139
  - **Connector version:** 0.1.1
140
- - **Generated with Connector SDK commit SHA:** 609c1d86c76b36ff699b57123a5a8c2050d958c3
140
+ - **Generated with Connector SDK commit SHA:** 74809153299f81ed3e220538146012ee2abd2e0d
@@ -13,14 +13,14 @@ from .models import (
13
13
  CustomerAddressList,
14
14
  MarketingConsent,
15
15
  OrderAddress,
16
+ LineItem,
16
17
  Transaction,
17
18
  Refund,
18
- LineItem,
19
19
  Fulfillment,
20
20
  Order,
21
21
  OrderList,
22
- ProductImage,
23
22
  ProductVariant,
23
+ ProductImage,
24
24
  Product,
25
25
  ProductList,
26
26
  ProductVariantList,
@@ -186,14 +186,14 @@ __all__ = [
186
186
  "CustomerAddressList",
187
187
  "MarketingConsent",
188
188
  "OrderAddress",
189
+ "LineItem",
189
190
  "Transaction",
190
191
  "Refund",
191
- "LineItem",
192
192
  "Fulfillment",
193
193
  "Order",
194
194
  "OrderList",
195
- "ProductImage",
196
195
  "ProductVariant",
196
+ "ProductImage",
197
197
  "Product",
198
198
  "ProductList",
199
199
  "ProductVariantList",
@@ -62,6 +62,53 @@ class TokenExtractValidationError(ConnectorModelLoaderError):
62
62
  pass
63
63
 
64
64
 
65
+ # Expected auth_mapping keys for each auth type.
66
+ # These are the auth parameters that each security scheme expects, NOT the user's credential field names.
67
+ EXPECTED_AUTH_MAPPING_KEYS: dict[AuthType, set[str]] = {
68
+ AuthType.BEARER: {"token"},
69
+ AuthType.BASIC: {"username", "password"},
70
+ AuthType.API_KEY: {"api_key"},
71
+ AuthType.OAUTH2: {"access_token", "refresh_token", "client_id", "client_secret"},
72
+ }
73
+
74
+
75
+ def _validate_auth_mapping_keys(
76
+ auth_type: AuthType,
77
+ auth_config: AirbyteAuthConfig | None,
78
+ scheme_name: str = "default",
79
+ ) -> None:
80
+ """Validate that auth_mapping keys match expected parameters for the auth type.
81
+
82
+ The auth_mapping keys must be the parameters expected by the security scheme
83
+ (e.g., "token" for bearer), not the user's credential field names.
84
+
85
+ Args:
86
+ auth_type: The authentication type
87
+ auth_config: The x-airbyte-auth-config containing auth_mapping
88
+ scheme_name: Name of the security scheme for error messages
89
+
90
+ Raises:
91
+ InvalidOpenAPIError: If auth_mapping keys don't match expected parameters
92
+ """
93
+ if auth_config is None or auth_config.auth_mapping is None:
94
+ return # No explicit auth_mapping, will use defaults
95
+
96
+ expected_keys = EXPECTED_AUTH_MAPPING_KEYS.get(auth_type)
97
+ if expected_keys is None:
98
+ return # Unknown auth type, skip validation
99
+
100
+ actual_keys = set(auth_config.auth_mapping.keys())
101
+ invalid_keys = actual_keys - expected_keys
102
+
103
+ if invalid_keys:
104
+ raise InvalidOpenAPIError(
105
+ f"Invalid auth_mapping keys for {auth_type.value} auth in scheme '{scheme_name}': {invalid_keys}. "
106
+ f"Expected keys for {auth_type.value}: {sorted(expected_keys)}. "
107
+ f"Note: auth_mapping keys must be the auth parameters (e.g., 'token' for bearer), "
108
+ f'not your credential field names. Use template syntax to map: token: "${{your_field}}"'
109
+ )
110
+
111
+
65
112
  def extract_path_params(path: str) -> list[str]:
66
113
  """Extract parameter names from path template.
67
114
 
@@ -924,6 +971,9 @@ def _parse_single_security_scheme(scheme: Any) -> AuthConfig:
924
971
  oauth2_config = _parse_oauth2_config(scheme)
925
972
  # Use explicit x-airbyte-auth-config if present, otherwise generate default
926
973
  auth_config_obj = scheme.x_airbyte_auth_config or _generate_default_auth_config(AuthType.OAUTH2)
974
+ # Validate auth_mapping keys if explicitly provided
975
+ if scheme.x_airbyte_auth_config:
976
+ _validate_auth_mapping_keys(AuthType.OAUTH2, scheme.x_airbyte_auth_config)
927
977
  return AuthConfig(
928
978
  type=AuthType.OAUTH2,
929
979
  config=oauth2_config,
@@ -934,6 +984,10 @@ def _parse_single_security_scheme(scheme: Any) -> AuthConfig:
934
984
  # Use explicit x-airbyte-auth-config if present, otherwise generate default
935
985
  auth_config_obj = scheme.x_airbyte_auth_config or _generate_default_auth_config(auth_type)
936
986
 
987
+ # Validate auth_mapping keys if explicitly provided
988
+ if scheme.x_airbyte_auth_config:
989
+ _validate_auth_mapping_keys(auth_type, scheme.x_airbyte_auth_config)
990
+
937
991
  return AuthConfig(
938
992
  type=auth_type,
939
993
  config=auth_config,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "airbyte-agent-shopify"
3
- version = "0.1.9"
3
+ version = "0.1.11"
4
4
  description = "Airbyte Shopify Connector for AI platforms"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -119,6 +119,40 @@ class OrderAddress(BaseModel):
119
119
  latitude: Union[float | None, Any] = Field(default=None)
120
120
  longitude: Union[float | None, Any] = Field(default=None)
121
121
 
122
+ class LineItem(BaseModel):
123
+ """LineItem type definition"""
124
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
125
+
126
+ id: Union[int, Any] = Field(default=None)
127
+ admin_graphql_api_id: Union[str | None, Any] = Field(default=None)
128
+ attributed_staffs: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
129
+ current_quantity: Union[int | None, Any] = Field(default=None)
130
+ fulfillable_quantity: Union[int | None, Any] = Field(default=None)
131
+ fulfillment_service: Union[str | None, Any] = Field(default=None)
132
+ fulfillment_status: Union[str | None, Any] = Field(default=None)
133
+ gift_card: Union[bool | None, Any] = Field(default=None)
134
+ grams: Union[int | None, Any] = Field(default=None)
135
+ name: Union[str | None, Any] = Field(default=None)
136
+ price: Union[str | None, Any] = Field(default=None)
137
+ price_set: Union[dict[str, Any] | None, Any] = Field(default=None)
138
+ product_exists: Union[bool | None, Any] = Field(default=None)
139
+ product_id: Union[int | None, Any] = Field(default=None)
140
+ properties: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
141
+ quantity: Union[int | None, Any] = Field(default=None)
142
+ requires_shipping: Union[bool | None, Any] = Field(default=None)
143
+ sku: Union[str | None, Any] = Field(default=None)
144
+ taxable: Union[bool | None, Any] = Field(default=None)
145
+ title: Union[str | None, Any] = Field(default=None)
146
+ total_discount: Union[str | None, Any] = Field(default=None)
147
+ total_discount_set: Union[dict[str, Any] | None, Any] = Field(default=None)
148
+ variant_id: Union[int | None, Any] = Field(default=None)
149
+ variant_inventory_management: Union[str | None, Any] = Field(default=None)
150
+ variant_title: Union[str | None, Any] = Field(default=None)
151
+ vendor: Union[str | None, Any] = Field(default=None)
152
+ tax_lines: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
153
+ duties: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
154
+ discount_allocations: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
155
+
122
156
  class Transaction(BaseModel):
123
157
  """An order transaction"""
124
158
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -168,40 +202,6 @@ class Refund(BaseModel):
168
202
  admin_graphql_api_id: Union[str | None, Any] = Field(default=None)
169
203
  refund_shipping_lines: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
170
204
 
171
- class LineItem(BaseModel):
172
- """LineItem type definition"""
173
- model_config = ConfigDict(extra="allow", populate_by_name=True)
174
-
175
- id: Union[int, Any] = Field(default=None)
176
- admin_graphql_api_id: Union[str | None, Any] = Field(default=None)
177
- attributed_staffs: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
178
- current_quantity: Union[int | None, Any] = Field(default=None)
179
- fulfillable_quantity: Union[int | None, Any] = Field(default=None)
180
- fulfillment_service: Union[str | None, Any] = Field(default=None)
181
- fulfillment_status: Union[str | None, Any] = Field(default=None)
182
- gift_card: Union[bool | None, Any] = Field(default=None)
183
- grams: Union[int | None, Any] = Field(default=None)
184
- name: Union[str | None, Any] = Field(default=None)
185
- price: Union[str | None, Any] = Field(default=None)
186
- price_set: Union[dict[str, Any] | None, Any] = Field(default=None)
187
- product_exists: Union[bool | None, Any] = Field(default=None)
188
- product_id: Union[int | None, Any] = Field(default=None)
189
- properties: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
190
- quantity: Union[int | None, Any] = Field(default=None)
191
- requires_shipping: Union[bool | None, Any] = Field(default=None)
192
- sku: Union[str | None, Any] = Field(default=None)
193
- taxable: Union[bool | None, Any] = Field(default=None)
194
- title: Union[str | None, Any] = Field(default=None)
195
- total_discount: Union[str | None, Any] = Field(default=None)
196
- total_discount_set: Union[dict[str, Any] | None, Any] = Field(default=None)
197
- variant_id: Union[int | None, Any] = Field(default=None)
198
- variant_inventory_management: Union[str | None, Any] = Field(default=None)
199
- variant_title: Union[str | None, Any] = Field(default=None)
200
- vendor: Union[str | None, Any] = Field(default=None)
201
- tax_lines: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
202
- duties: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
203
- discount_allocations: Union[list[dict[str, Any]] | None, Any] = Field(default=None)
204
-
205
205
  class Fulfillment(BaseModel):
206
206
  """A fulfillment"""
207
207
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -329,22 +329,6 @@ class OrderList(BaseModel):
329
329
 
330
330
  orders: Union[list[Order], Any] = Field(default=None)
331
331
 
332
- class ProductImage(BaseModel):
333
- """A product image"""
334
- model_config = ConfigDict(extra="allow", populate_by_name=True)
335
-
336
- id: Union[int, Any] = Field(default=None)
337
- product_id: Union[int | None, Any] = Field(default=None)
338
- position: Union[int | None, Any] = Field(default=None)
339
- created_at: Union[str | None, Any] = Field(default=None)
340
- updated_at: Union[str | None, Any] = Field(default=None)
341
- alt: Union[str | None, Any] = Field(default=None)
342
- width: Union[int | None, Any] = Field(default=None)
343
- height: Union[int | None, Any] = Field(default=None)
344
- src: Union[str | None, Any] = Field(default=None)
345
- variant_ids: Union[list[int] | None, Any] = Field(default=None)
346
- admin_graphql_api_id: Union[str | None, Any] = Field(default=None)
347
-
348
332
  class ProductVariant(BaseModel):
349
333
  """A product variant"""
350
334
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -376,6 +360,22 @@ class ProductVariant(BaseModel):
376
360
  requires_shipping: Union[bool | None, Any] = Field(default=None)
377
361
  admin_graphql_api_id: Union[str | None, Any] = Field(default=None)
378
362
 
363
+ class ProductImage(BaseModel):
364
+ """A product image"""
365
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
366
+
367
+ id: Union[int, Any] = Field(default=None)
368
+ product_id: Union[int | None, Any] = Field(default=None)
369
+ position: Union[int | None, Any] = Field(default=None)
370
+ created_at: Union[str | None, Any] = Field(default=None)
371
+ updated_at: Union[str | None, Any] = Field(default=None)
372
+ alt: Union[str | None, Any] = Field(default=None)
373
+ width: Union[int | None, Any] = Field(default=None)
374
+ height: Union[int | None, Any] = Field(default=None)
375
+ src: Union[str | None, Any] = Field(default=None)
376
+ variant_ids: Union[list[int] | None, Any] = Field(default=None)
377
+ admin_graphql_api_id: Union[str | None, Any] = Field(default=None)
378
+
379
379
  class Product(BaseModel):
380
380
  """A Shopify product"""
381
381
  model_config = ConfigDict(extra="allow", populate_by_name=True)