etsy-python 1.0.19__tar.gz → 1.0.20__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 (76) hide show
  1. etsy_python-1.0.20/PKG-INFO +490 -0
  2. etsy_python-1.0.20/README.md +469 -0
  3. etsy_python-1.0.20/etsy_python/__init__.py +3 -0
  4. etsy_python-1.0.20/etsy_python/_version.py +3 -0
  5. etsy_python-1.0.20/etsy_python.egg-info/PKG-INFO +490 -0
  6. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python.egg-info/SOURCES.txt +1 -0
  7. {etsy_python-1.0.19 → etsy_python-1.0.20}/setup.py +12 -1
  8. etsy_python-1.0.19/PKG-INFO +0 -265
  9. etsy_python-1.0.19/README.md +0 -244
  10. etsy_python-1.0.19/etsy_python/__init__.py +0 -1
  11. etsy_python-1.0.19/etsy_python.egg-info/PKG-INFO +0 -265
  12. {etsy_python-1.0.19 → etsy_python-1.0.20}/LICENSE +0 -0
  13. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/__init__.py +0 -0
  14. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/auth/OAuth.py +0 -0
  15. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/auth/__init__.py +0 -0
  16. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/common/Env.py +0 -0
  17. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/common/Request.py +0 -0
  18. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/common/Utils.py +0 -0
  19. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/common/__init__.py +0 -0
  20. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/HolidayPreferences.py +0 -0
  21. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/Language.py +0 -0
  22. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/Listing.py +0 -0
  23. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/ListingInventory.py +0 -0
  24. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/ShippingProfile.py +0 -0
  25. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/ShopReceipt.py +0 -0
  26. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/enums/__init__.py +0 -0
  27. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/exceptions/BaseAPIException.py +0 -0
  28. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/exceptions/RequestException.py +0 -0
  29. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/exceptions/__init__.py +0 -0
  30. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/FileRequest.py +0 -0
  31. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/HolidayPreferences.py +0 -0
  32. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Listing.py +0 -0
  33. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Miscellaneous.py +0 -0
  34. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Product.py +0 -0
  35. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Receipt.py +0 -0
  36. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Request.py +0 -0
  37. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/ShippingProfile.py +0 -0
  38. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Shop.py +0 -0
  39. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/ShopReturnPolicy.py +0 -0
  40. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/Utils.py +0 -0
  41. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/models/__init__.py +0 -0
  42. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/HolidayPreferences.py +0 -0
  43. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Listing.py +0 -0
  44. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingFile.py +0 -0
  45. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingImage.py +0 -0
  46. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingInventory.py +0 -0
  47. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingOffering.py +0 -0
  48. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingProduct.py +0 -0
  49. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingTranslation.py +0 -0
  50. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingVariationImages.py +0 -0
  51. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ListingVideo.py +0 -0
  52. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Miscellaneous.py +0 -0
  53. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Payment.py +0 -0
  54. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/PaymentLedgerEntry.py +0 -0
  55. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Receipt.py +0 -0
  56. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ReceiptTransactions.py +0 -0
  57. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Response.py +0 -0
  58. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Review.py +0 -0
  59. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Session.py +0 -0
  60. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ShippingProfile.py +0 -0
  61. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Shop.py +0 -0
  62. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ShopProductionPartner.py +0 -0
  63. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ShopReturnPolicy.py +0 -0
  64. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/ShopSection.py +0 -0
  65. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/Taxonomy.py +0 -0
  66. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/User.py +0 -0
  67. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/UserAddress.py +0 -0
  68. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/__init__.py +0 -0
  69. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/enums/RateLimit.py +0 -0
  70. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/enums/Request.py +0 -0
  71. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/resources/enums/__init__.py +0 -0
  72. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python/v3/tests/__init__.py +0 -0
  73. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python.egg-info/dependency_links.txt +0 -0
  74. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python.egg-info/requires.txt +0 -0
  75. {etsy_python-1.0.19 → etsy_python-1.0.20}/etsy_python.egg-info/top_level.txt +0 -0
  76. {etsy_python-1.0.19 → etsy_python-1.0.20}/setup.cfg +0 -0
@@ -0,0 +1,490 @@
1
+ Metadata-Version: 2.1
2
+ Name: etsy-python
3
+ Version: 1.0.20
4
+ Summary: Etsy API Client Library for Python
5
+ Author: Amit Ray
6
+ Author-email: mail@amitray.dev
7
+ Project-URL: Documentation, https://github.com/amitray007/etsy-python-sdk/blob/master/README.md
8
+ Project-URL: Source code, https://github.com/amitray007/etsy-python-sdk
9
+ Project-URL: Issues, https://github.com/amitray007/etsy-python-sdk/issues
10
+ Keywords: python,etsy,api
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Operating System :: Unix
14
+ Classifier: Operating System :: MacOS :: MacOS X
15
+ Classifier: Operating System :: Microsoft :: Windows
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: requests
19
+ Requires-Dist: requests-oauthlib
20
+
21
+
22
+ <p align="center">
23
+ <h1 align="center">Etsy API Client Library for Python</h1>
24
+ </p>
25
+
26
+ <p align="center">
27
+ <img src="https://img.shields.io/pypi/v/etsy-python?style=for-the-badge&color=0080ff&style=default" alt="PyPI version">
28
+ <img src="https://img.shields.io/github/license/amitray007/etsy-python-sdk?style=default&color=0080ff" alt="license">
29
+ <img src="https://img.shields.io/github/last-commit/amitray007/etsy-python-sdk?style=default&color=0080ff" alt="last-commit">
30
+ <img src="https://img.shields.io/github/languages/top/amitray007/etsy-python-sdk?style=default&color=0080ff" alt="repo-top-language">
31
+ <p>
32
+
33
+ <p align="center">
34
+ <img src="https://www.etsy.com/images/apps/documentation/edc_badge3.gif" alt="etsy-api-badge">
35
+ </p>
36
+
37
+ ---
38
+
39
+ ## Table of Contents
40
+
41
+ - [Overview](#overview)
42
+ - [Features](#features)
43
+ - [Requirements](#requirements)
44
+ - [Installation](#installation)
45
+ - [Install from PyPI](#install-from-pypi)
46
+ - [Install from Source](#install-from-source)
47
+ - [Dependencies](#dependencies)
48
+ - [Quick Start](#quick-start)
49
+ - [1. Authentication Setup](#1-authentication-setup)
50
+ - [2. Initialize Client Session](#2-initialize-client-session)
51
+ - [3. Make API Calls](#3-make-api-calls)
52
+ - [Usage Examples](#usage-examples)
53
+ - [Managing Listings](#managing-listings)
54
+ - [Working with Receipts](#working-with-receipts)
55
+ - [Uploading Images](#uploading-images)
56
+ - [Handling Shipping Profiles](#handling-shipping-profiles)
57
+ - [Token Management with Callback](#token-management-with-callback)
58
+ - [API Resources](#api-resources)
59
+ - [Core Resources](#core-resources)
60
+ - [Media Resources](#media-resources)
61
+ - [Commerce Resources](#commerce-resources)
62
+ - [Shop Management](#shop-management)
63
+ - [Error Handling](#error-handling)
64
+ - [Environment Configuration](#environment-configuration)
65
+ - [Project Structure](#project-structure)
66
+ - [Contributing](#contributing)
67
+ - [Development Setup](#development-setup)
68
+ - [Support](#support)
69
+ - [License](#license)
70
+ - [Changelog](#changelog)
71
+
72
+ ---
73
+
74
+ ## Overview
75
+
76
+ A comprehensive Python client library for the Etsy API v3, providing a modern, type-safe interface for interacting with the Etsy marketplace. This SDK simplifies OAuth 2.0 authentication, automatic token refresh, and provides complete coverage of Etsy's API endpoints.
77
+
78
+ ## Features
79
+
80
+ ✨ **Complete API Coverage** - Full support for Etsy API v3 endpoints including:
81
+
82
+ - Listings management (create, update, delete, search)
83
+ - Shop operations (sections, policies, production partners)
84
+ - Receipt and transaction handling
85
+ - Shipping profiles and destinations
86
+ - Product taxonomy and attributes
87
+ - File, image, and video uploads
88
+ - Reviews and payment processing
89
+
90
+ 🔐 **Robust Authentication** - OAuth 2.0 with PKCE support:
91
+
92
+ - Secure authorization code flow
93
+ - Automatic token refresh before expiry
94
+ - Custom token synchronization callbacks
95
+ - Session management with timezone-aware expiry handling
96
+
97
+ 🏗️ **Developer-Friendly Architecture**:
98
+
99
+ - Type-safe request/response models using dataclasses
100
+ - Comprehensive enum definitions for API parameters
101
+ - Consistent error handling with detailed exceptions
102
+ - Rate limiting information in responses
103
+ - Clean separation of concerns with resource-based structure
104
+
105
+ ⚡ **Production Ready**:
106
+
107
+ - Built-in retry logic for failed requests
108
+ - Configurable environments (production/staging)
109
+ - Extensive error handling and validation
110
+ - Support for file uploads and multipart requests
111
+
112
+ ## Requirements
113
+
114
+ - Python 3.8 or higher
115
+ - An Etsy App API Key (get one at [Etsy Developers](https://www.etsy.com/developers))
116
+
117
+ ## Installation
118
+
119
+ ### Install from PyPI
120
+
121
+ ```bash
122
+ pip install etsy-python
123
+ ```
124
+
125
+ ### Install from Source
126
+
127
+ ```bash
128
+ git clone https://github.com/amitray007/etsy-python-sdk.git
129
+ cd etsy-python-sdk
130
+ pip install -e .
131
+ ```
132
+
133
+ ### Dependencies
134
+
135
+ The SDK requires:
136
+
137
+ - `requests>=2.32.2` - HTTP client library
138
+ - `requests-oauthlib>=1.3.1` - OAuth 2.0 support
139
+
140
+ ## Quick Start
141
+
142
+ ### 1. Authentication Setup
143
+
144
+ ```python
145
+ from etsy_python.v3.auth.OAuth import EtsyOAuth
146
+
147
+ # Initialize OAuth client
148
+ oauth = EtsyOAuth(
149
+ keystring="your_api_key",
150
+ redirect_uri="http://localhost:8000/callback",
151
+ scopes=["listings_r", "listings_w", "shops_r", "shops_w"]
152
+ )
153
+
154
+ # Get authorization URL
155
+ auth_url, state = oauth.get_auth_code()
156
+ print(f"Visit this URL to authorize: {auth_url}")
157
+
158
+ # After user authorizes, set the authorization code
159
+ oauth.set_authorisation_code(code="auth_code_from_callback", state=state)
160
+
161
+ # Get access token
162
+ token_data = oauth.get_access_token()
163
+ ```
164
+
165
+ ### 2. Initialize Client Session
166
+
167
+ ```python
168
+ from datetime import datetime
169
+ from etsy_python.v3.resources.Session import EtsyClient
170
+
171
+ # Create client with tokens
172
+ client = EtsyClient(
173
+ keystring="your_api_key",
174
+ access_token=token_data["access_token"],
175
+ refresh_token=token_data["refresh_token"],
176
+ expiry=datetime.utcnow() + timedelta(seconds=token_data["expires_in"])
177
+ )
178
+ ```
179
+
180
+ ### 3. Make API Calls
181
+
182
+ ```python
183
+ from etsy_python.v3.resources.Listing import ListingResource
184
+ from etsy_python.v3.enums.Listing import State, SortOn, SortOrder
185
+
186
+ # Initialize resource
187
+ listing_resource = ListingResource(session=client)
188
+
189
+ # Get active listings for a shop
190
+ response = listing_resource.get_listings_by_shop(
191
+ shop_id=12345,
192
+ state=State.ACTIVE,
193
+ limit=25,
194
+ sort_on=SortOn.CREATED,
195
+ sort_order=SortOrder.DESC
196
+ )
197
+
198
+ print(f"Found {len(response.message['results'])} listings")
199
+ ```
200
+
201
+ ## Usage Examples
202
+
203
+ ### Managing Listings
204
+
205
+ ```python
206
+ from etsy_python.v3.models.Listing import CreateDraftListingRequest
207
+ from etsy_python.v3.enums.Listing import WhoMade, WhenMade
208
+
209
+ # Create a draft listing
210
+ draft_listing = CreateDraftListingRequest(
211
+ title="Handmade Ceramic Mug",
212
+ description="Beautiful handcrafted ceramic mug",
213
+ price=25.00,
214
+ quantity=10,
215
+ who_made=WhoMade.I_DID,
216
+ when_made=WhenMade.MADE_TO_ORDER,
217
+ taxonomy_id=1234,
218
+ tags=["ceramic", "mug", "handmade"]
219
+ )
220
+
221
+ response = listing_resource.create_draft_listing(
222
+ shop_id=12345,
223
+ listing=draft_listing
224
+ )
225
+ ```
226
+
227
+ ### Working with Receipts
228
+
229
+ ```python
230
+ from etsy_python.v3.resources.Receipt import ReceiptResource
231
+ from etsy_python.v3.models.Receipt import CreateReceiptShipmentRequest
232
+
233
+ receipt_resource = ReceiptResource(session=client)
234
+
235
+ # Get shop receipts
236
+ receipts = receipt_resource.get_shop_receipts(
237
+ shop_id=12345,
238
+ limit=50
239
+ )
240
+
241
+ # Create shipment for a receipt
242
+ shipment_request = CreateReceiptShipmentRequest(
243
+ tracking_number="1Z999AA10123456784",
244
+ carrier_name="USPS",
245
+ notification_sent=True
246
+ )
247
+
248
+ receipt_resource.create_receipt_shipment(
249
+ shop_id=12345,
250
+ receipt_id=67890,
251
+ shipment=shipment_request
252
+ )
253
+ ```
254
+
255
+ ### Uploading Images
256
+
257
+ ```python
258
+ from etsy_python.v3.resources.ListingImage import ListingImageResource
259
+ from etsy_python.v3.models.Listing import UploadListingImageRequest
260
+
261
+ image_resource = ListingImageResource(session=client)
262
+
263
+ # Upload image to listing
264
+ with open("product_photo.jpg", "rb") as image_file:
265
+ upload_request = UploadListingImageRequest(
266
+ image=image_file,
267
+ alt_text="Front view of ceramic mug"
268
+ )
269
+
270
+ response = image_resource.upload_listing_image(
271
+ shop_id=12345,
272
+ listing_id=67890,
273
+ image=upload_request
274
+ )
275
+ ```
276
+
277
+ ### Handling Shipping Profiles
278
+
279
+ ```python
280
+ from etsy_python.v3.resources.ShippingProfile import ShippingProfileResource
281
+ from etsy_python.v3.models.ShippingProfile import CreateShopShippingProfileRequest
282
+ from etsy_python.v3.enums.ShippingProfile import ProcessingTimeUnit
283
+
284
+ shipping_resource = ShippingProfileResource(session=client)
285
+
286
+ # Create shipping profile
287
+ profile_request = CreateShopShippingProfileRequest(
288
+ title="Standard Shipping",
289
+ processing_time_value=3,
290
+ processing_time_unit=ProcessingTimeUnit.BUSINESS_DAYS,
291
+ origin_country_iso="US",
292
+ primary_cost=5.00,
293
+ secondary_cost=2.00
294
+ )
295
+
296
+ response = shipping_resource.create_shop_shipping_profile(
297
+ shop_id=12345,
298
+ profile=profile_request
299
+ )
300
+ ```
301
+
302
+ ### Token Management with Callback
303
+
304
+ ```python
305
+ def save_tokens_to_database(access_token, refresh_token, expiry):
306
+ """Custom function to persist tokens"""
307
+ # Your database logic here
308
+ pass
309
+
310
+ # Initialize client with token sync callback
311
+ client = EtsyClient(
312
+ keystring="your_api_key",
313
+ access_token=access_token,
314
+ refresh_token=refresh_token,
315
+ expiry=expiry,
316
+ sync_refresh=save_tokens_to_database
317
+ )
318
+
319
+ # Tokens will be automatically refreshed and saved when expired
320
+ ```
321
+
322
+ ## API Resources
323
+
324
+ The SDK provides comprehensive coverage of Etsy API v3 resources:
325
+
326
+ ### Core Resources
327
+
328
+ - **Listing** - Create, read, update, delete listings
329
+ - **Shop** - Manage shop information and settings
330
+ - **Receipt** - Handle orders and transactions
331
+ - **User** - User profiles and addresses
332
+ - **ShippingProfile** - Configure shipping options
333
+
334
+ ### Media Resources
335
+
336
+ - **ListingImage** - Upload and manage listing images
337
+ - **ListingVideo** - Upload and manage listing videos
338
+ - **ListingFile** - Digital file management
339
+
340
+ ### Commerce Resources
341
+
342
+ - **ListingInventory** - Stock and SKU management
343
+ - **Payment** - Payment processing and ledger entries
344
+ - **Review** - Customer reviews management
345
+
346
+ ### Shop Management
347
+
348
+ - **ShopSection** - Organize listings into sections
349
+ - **ShopReturnPolicy** - Define return policies
350
+ - **ShopProductionPartner** - Manage production partners
351
+
352
+ ## Error Handling
353
+
354
+ The SDK provides detailed error information through custom exceptions:
355
+
356
+ ```python
357
+ from etsy_python.v3.exceptions.RequestException import RequestException
358
+
359
+ try:
360
+ response = listing_resource.get_listing(listing_id=12345)
361
+ except RequestException as e:
362
+ print(f"Error Code: {e.code}")
363
+ print(f"Error Message: {e.error}")
364
+ print(f"Error Description: {e.type}")
365
+
366
+ # Rate limit information (if available)
367
+ if e.rate_limits:
368
+ print(f"Daily Limit: {e.rate_limits.limit_per_day}")
369
+ print(f"Remaining Today: {e.rate_limits.remaining_today}")
370
+ ```
371
+
372
+ ## Environment Configuration
373
+
374
+ Configure the SDK environment using environment variables:
375
+
376
+ ```bash
377
+ # Set environment (defaults to PROD)
378
+ export ETSY_ENV=PROD
379
+ ```
380
+
381
+ ## Project Structure
382
+
383
+ ```
384
+ etsy-python-sdk/
385
+ ├── etsy_python/
386
+ │ └── v3/
387
+ │ ├── auth/ # OAuth authentication
388
+ │ ├── common/ # Shared utilities
389
+ │ ├── enums/ # API enum definitions
390
+ │ ├── exceptions/ # Custom exceptions
391
+ │ ├── models/ # Request/response models
392
+ │ └── resources/ # API endpoint implementations
393
+ ├── setup.py # Package configuration
394
+ ├── LICENSE # MIT License
395
+ └── README.md # Documentation
396
+ ```
397
+
398
+ ## Contributing
399
+
400
+ We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
401
+
402
+ ### Automatic Versioning
403
+
404
+ This project uses automatic semantic versioning based on commit messages:
405
+
406
+ - **Commits with `breaking:` or `BREAKING CHANGE`** → Major version bump (1.0.0 → 2.0.0)
407
+ - **Commits with `feat:` or containing `feature`** → Minor version bump (1.0.0 → 1.1.0)
408
+ - **All other commits** → Patch version bump (1.0.0 → 1.0.1)
409
+
410
+ The version is automatically bumped when changes are pushed to the `master` branch, and the package is automatically published to PyPI.
411
+
412
+ #### Skipping CI/CD
413
+
414
+ To skip the automatic versioning and publishing workflow, include one of these phrases in your commit message:
415
+ - `[skip ci]`
416
+ - `[ci skip]`
417
+ - `skip ci`
418
+ - `[no ci]`
419
+
420
+ Example:
421
+ ```bash
422
+ git commit -m "docs: update README [skip ci]"
423
+ ```
424
+
425
+ #### Manual Release (for maintainers)
426
+
427
+ For local testing or manual releases:
428
+
429
+ ```bash
430
+ # Install development dependencies
431
+ pip install -e .
432
+
433
+ # Create a patch release
434
+ python scripts/release.py patch
435
+
436
+ # Create a minor release
437
+ python scripts/release.py minor
438
+
439
+ # Create a major release
440
+ python scripts/release.py major
441
+
442
+ # Dry run (local only, no push)
443
+ python scripts/release.py patch --no-push
444
+ ```
445
+
446
+ ### Development Setup
447
+
448
+ 1. Fork the repository
449
+ 2. Clone your fork:
450
+ ```bash
451
+ git clone https://github.com/yourusername/etsy-python-sdk.git
452
+ cd etsy-python-sdk
453
+ ```
454
+ 3. Create a virtual environment:
455
+ ```bash
456
+ python -m venv venv
457
+ source venv/bin/activate # On Windows: venv\Scripts\activate
458
+ ```
459
+ 4. Install dependencies:
460
+ ```bash
461
+ pip install -r etsy_python/requirements.txt
462
+ ```
463
+ 5. Create a feature branch:
464
+ ```bash
465
+ git checkout -b feature/your-feature-name
466
+ ```
467
+ 6. Make your changes and commit:
468
+ ```bash
469
+ git commit -m "Add your feature"
470
+ ```
471
+ 7. Push and create a pull request
472
+
473
+ ## Support
474
+
475
+ - **Documentation**: [GitHub Wiki](https://github.com/amitray007/etsy-python-sdk/wiki)
476
+ - **Issues**: [GitHub Issues](https://github.com/amitray007/etsy-python-sdk/issues)
477
+ - **Etsy API Docs**: [developers.etsy.com](https://developers.etsy.com/documentation)
478
+
479
+ ## License
480
+
481
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
482
+
483
+ ## Changelog
484
+
485
+ See [Releases](https://github.com/amitray007/etsy-python-sdk/releases) for full changelog.
486
+
487
+ ---
488
+
489
+ <p align="center">Made with ❤️ for the Etsy developer community</p>
490
+