etsy-python 1.1.13__tar.gz → 1.2.0__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.
- {etsy_python-1.1.13/etsy_python.egg-info → etsy_python-1.2.0}/PKG-INFO +1 -1
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/_version.py +1 -1
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/ListingInventory.py +0 -4
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Listing.py +86 -17
- {etsy_python-1.1.13 → etsy_python-1.2.0/etsy_python.egg-info}/PKG-INFO +1 -1
- {etsy_python-1.1.13 → etsy_python-1.2.0}/LICENSE +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/MANIFEST.in +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/README.md +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/auth/OAuth.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/auth/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/common/Env.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/common/Request.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/common/Utils.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/common/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/HolidayPreferences.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/Language.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/Listing.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/ProcessingProfile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/ShippingProfile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/ShopReceipt.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/enums/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/exceptions/BaseAPIException.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/exceptions/RequestException.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/exceptions/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/FileRequest.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/HolidayPreferences.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Miscellaneous.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/ProcessingProfile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Product.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Receipt.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Request.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/ShippingProfile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Shop.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/ShopReturnPolicy.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/Utils.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/models/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/HolidayPreferences.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Listing.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingFile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingImage.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingInventory.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingOffering.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingProduct.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingTranslation.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingVariationImages.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ListingVideo.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Miscellaneous.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Payment.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/PaymentLedgerEntry.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ProcessingProfile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Receipt.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ReceiptTransactions.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Response.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Review.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Session.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ShippingProfile.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Shop.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ShopProductionPartner.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ShopReturnPolicy.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/ShopSection.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/Taxonomy.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/User.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/UserAddress.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/enums/RateLimit.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/enums/Request.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python/v3/resources/enums/__init__.py +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python.egg-info/SOURCES.txt +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python.egg-info/dependency_links.txt +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python.egg-info/requires.txt +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/etsy_python.egg-info/top_level.txt +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/setup.cfg +0 -0
- {etsy_python-1.1.13 → etsy_python-1.2.0}/setup.py +0 -0
|
@@ -17,7 +17,8 @@ from etsy_python.v3.models.FileRequest import FileRequest
|
|
|
17
17
|
_PERSONALIZATION_DEPRECATION_MSG = (
|
|
18
18
|
"is_personalizable, personalization_is_required, "
|
|
19
19
|
"personalization_char_count_max, and personalization_instructions "
|
|
20
|
-
"
|
|
20
|
+
"were removed from createDraftListing and updateListing by the Etsy API "
|
|
21
|
+
"and are no longer sent. "
|
|
21
22
|
"Use the personalization endpoint (update_listing_personalization) "
|
|
22
23
|
"instead. See "
|
|
23
24
|
"https://developers.etsy.com/documentation/tutorials/personalization-migration "
|
|
@@ -30,12 +31,18 @@ def _warn_if_personalization_used(
|
|
|
30
31
|
personalization_is_required: Optional[bool],
|
|
31
32
|
personalization_char_count_max: Optional[int],
|
|
32
33
|
personalization_instructions: Optional[str],
|
|
34
|
+
stacklevel: int = 4,
|
|
33
35
|
) -> None:
|
|
34
|
-
"""Emit DeprecationWarning when a
|
|
36
|
+
"""Emit DeprecationWarning when a removed personalization field is actively set.
|
|
35
37
|
|
|
36
38
|
Falsy values (False, 0, empty string, None) match the API's documented
|
|
37
|
-
defaults and
|
|
38
|
-
trigger the warning.
|
|
39
|
+
defaults and were no-ops even before the fields were removed, so they do
|
|
40
|
+
not trigger the warning.
|
|
41
|
+
|
|
42
|
+
``stacklevel`` counts the frames back to the caller. It defaults to the
|
|
43
|
+
constructor path (this function <- ``_store_personalization`` <- model
|
|
44
|
+
``__init__`` <- caller); the property setters pass 3, being one frame
|
|
45
|
+
shallower.
|
|
39
46
|
"""
|
|
40
47
|
if any([
|
|
41
48
|
is_personalizable,
|
|
@@ -46,11 +53,81 @@ def _warn_if_personalization_used(
|
|
|
46
53
|
warnings.warn(
|
|
47
54
|
_PERSONALIZATION_DEPRECATION_MSG,
|
|
48
55
|
DeprecationWarning,
|
|
49
|
-
stacklevel=
|
|
56
|
+
stacklevel=stacklevel,
|
|
50
57
|
)
|
|
51
58
|
|
|
52
59
|
|
|
53
|
-
class
|
|
60
|
+
class _PersonalizationFieldsMixin:
|
|
61
|
+
"""Accessors for the personalization fields Etsy removed from listings.
|
|
62
|
+
|
|
63
|
+
Etsy dropped these four fields from the createDraftListing and
|
|
64
|
+
updateListing request bodies (2026-09 spec). The constructor keyword
|
|
65
|
+
arguments are kept so existing callers don't break, but the values are
|
|
66
|
+
stored under underscore-prefixed names, which ``todict`` excludes from
|
|
67
|
+
serialization -- so they are never sent on the wire.
|
|
68
|
+
|
|
69
|
+
The properties below keep both attribute reads and writes working. A write
|
|
70
|
+
stores the value and warns, exactly like passing the keyword argument: it
|
|
71
|
+
never reaches the API either way. Remove the keyword arguments and this
|
|
72
|
+
mixin in the next major version.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def is_personalizable(self) -> Optional[bool]:
|
|
77
|
+
return self._is_personalizable
|
|
78
|
+
|
|
79
|
+
@is_personalizable.setter
|
|
80
|
+
def is_personalizable(self, value: Optional[bool]) -> None:
|
|
81
|
+
self._is_personalizable = value
|
|
82
|
+
_warn_if_personalization_used(value, None, None, None, stacklevel=3)
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def personalization_is_required(self) -> Optional[bool]:
|
|
86
|
+
return self._personalization_is_required
|
|
87
|
+
|
|
88
|
+
@personalization_is_required.setter
|
|
89
|
+
def personalization_is_required(self, value: Optional[bool]) -> None:
|
|
90
|
+
self._personalization_is_required = value
|
|
91
|
+
_warn_if_personalization_used(None, value, None, None, stacklevel=3)
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def personalization_char_count_max(self) -> Optional[int]:
|
|
95
|
+
return self._personalization_char_count_max
|
|
96
|
+
|
|
97
|
+
@personalization_char_count_max.setter
|
|
98
|
+
def personalization_char_count_max(self, value: Optional[int]) -> None:
|
|
99
|
+
self._personalization_char_count_max = value
|
|
100
|
+
_warn_if_personalization_used(None, None, value, None, stacklevel=3)
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def personalization_instructions(self) -> Optional[str]:
|
|
104
|
+
return self._personalization_instructions
|
|
105
|
+
|
|
106
|
+
@personalization_instructions.setter
|
|
107
|
+
def personalization_instructions(self, value: Optional[str]) -> None:
|
|
108
|
+
self._personalization_instructions = value
|
|
109
|
+
_warn_if_personalization_used(None, None, None, value, stacklevel=3)
|
|
110
|
+
|
|
111
|
+
def _store_personalization(
|
|
112
|
+
self,
|
|
113
|
+
is_personalizable: Optional[bool],
|
|
114
|
+
personalization_is_required: Optional[bool],
|
|
115
|
+
personalization_char_count_max: Optional[int],
|
|
116
|
+
personalization_instructions: Optional[str],
|
|
117
|
+
) -> None:
|
|
118
|
+
self._is_personalizable = is_personalizable
|
|
119
|
+
self._personalization_is_required = personalization_is_required
|
|
120
|
+
self._personalization_char_count_max = personalization_char_count_max
|
|
121
|
+
self._personalization_instructions = personalization_instructions
|
|
122
|
+
_warn_if_personalization_used(
|
|
123
|
+
is_personalizable,
|
|
124
|
+
personalization_is_required,
|
|
125
|
+
personalization_char_count_max,
|
|
126
|
+
personalization_instructions,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class CreateDraftListingRequest(_PersonalizationFieldsMixin, Request):
|
|
54
131
|
nullable = [
|
|
55
132
|
"shipping_profile_id",
|
|
56
133
|
"return_policy_id",
|
|
@@ -137,11 +214,7 @@ class CreateDraftListingRequest(Request):
|
|
|
137
214
|
self.item_height = item_height
|
|
138
215
|
self.item_weight_unit = item_weight_unit
|
|
139
216
|
self.item_dimensions_unit = item_dimensions_unit
|
|
140
|
-
self.
|
|
141
|
-
self.personalization_is_required = personalization_is_required
|
|
142
|
-
self.personalization_char_count_max = personalization_char_count_max
|
|
143
|
-
self.personalization_instructions = personalization_instructions
|
|
144
|
-
_warn_if_personalization_used(
|
|
217
|
+
self._store_personalization(
|
|
145
218
|
is_personalizable,
|
|
146
219
|
personalization_is_required,
|
|
147
220
|
personalization_char_count_max,
|
|
@@ -161,7 +234,7 @@ class CreateDraftListingRequest(Request):
|
|
|
161
234
|
)
|
|
162
235
|
|
|
163
236
|
|
|
164
|
-
class UpdateListingRequest(Request):
|
|
237
|
+
class UpdateListingRequest(_PersonalizationFieldsMixin, Request):
|
|
165
238
|
nullable: List[str] = [
|
|
166
239
|
"materials",
|
|
167
240
|
"shipping_profile_id",
|
|
@@ -232,11 +305,7 @@ class UpdateListingRequest(Request):
|
|
|
232
305
|
self.who_made = who_made
|
|
233
306
|
self.when_made = when_made
|
|
234
307
|
self.featured_rank = featured_rank
|
|
235
|
-
self.
|
|
236
|
-
self.personalization_is_required = personalization_is_required
|
|
237
|
-
self.personalization_char_count_max = personalization_char_count_max
|
|
238
|
-
self.personalization_instructions = personalization_instructions
|
|
239
|
-
_warn_if_personalization_used(
|
|
308
|
+
self._store_personalization(
|
|
240
309
|
is_personalizable,
|
|
241
310
|
personalization_is_required,
|
|
242
311
|
personalization_char_count_max,
|
|
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
|
|
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
|