recharge-api 2.0.0__tar.gz → 2.0.2__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 (100) hide show
  1. {recharge_api-2.0.0/recharge_api.egg-info → recharge_api-2.0.2}/PKG-INFO +1 -1
  2. {recharge_api-2.0.0 → recharge_api-2.0.2}/pyproject.toml +1 -1
  3. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/__init__.py +1 -1
  4. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/addresses.py +1 -1
  5. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/customers.py +0 -1
  6. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/addresses.py +2 -2
  7. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/bundle_selections.py +1 -1
  8. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/charges.py +2 -2
  9. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/collections.py +1 -1
  10. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/customers.py +1 -1
  11. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/discounts.py +1 -1
  12. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/events.py +1 -1
  13. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/metafields.py +1 -1
  14. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/onetimes.py +1 -1
  15. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/orders.py +1 -1
  16. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/payment_methods.py +1 -1
  17. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/plans.py +1 -1
  18. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/products.py +1 -1
  19. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/subscriptions.py +1 -1
  20. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/charge.py +25 -4
  21. {recharge_api-2.0.0 → recharge_api-2.0.2/recharge_api.egg-info}/PKG-INFO +1 -1
  22. {recharge_api-2.0.0 → recharge_api-2.0.2}/LICENSE +0 -0
  23. {recharge_api-2.0.0 → recharge_api-2.0.2}/README.md +0 -0
  24. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/__init__.py +0 -0
  25. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/__init__.py +0 -0
  26. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/async_batches.py +0 -0
  27. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/charges.py +0 -0
  28. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/checkouts.py +0 -0
  29. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/discounts.py +0 -0
  30. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/metafields.py +0 -0
  31. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/notifications.py +0 -0
  32. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/onetimes.py +0 -0
  33. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/orders.py +0 -0
  34. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/products.py +0 -0
  35. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/shop.py +0 -0
  36. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/subscriptions.py +0 -0
  37. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/tokens.py +0 -0
  38. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v1/webhooks.py +0 -0
  39. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/__init__.py +0 -0
  40. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/accounts.py +0 -0
  41. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/async_batches.py +0 -0
  42. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/checkouts.py +0 -0
  43. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/notifications.py +0 -0
  44. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/retention_strategies.py +0 -0
  45. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/store.py +0 -0
  46. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/tokens.py +0 -0
  47. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/api/v2/webhooks.py +0 -0
  48. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/client.py +0 -0
  49. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/exceptions.py +0 -0
  50. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/__init__.py +0 -0
  51. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/__init__.py +0 -0
  52. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/address.py +0 -0
  53. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/async_batch.py +0 -0
  54. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/charge.py +0 -0
  55. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/checkout.py +0 -0
  56. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/customer.py +0 -0
  57. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/discount.py +0 -0
  58. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/metafield.py +0 -0
  59. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/notification.py +0 -0
  60. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/onetime.py +0 -0
  61. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/order.py +0 -0
  62. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/product.py +0 -0
  63. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/shop.py +0 -0
  64. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/subscription.py +0 -0
  65. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/token.py +0 -0
  66. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v1/webhook.py +0 -0
  67. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/__init__.py +0 -0
  68. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/account.py +0 -0
  69. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/address.py +0 -0
  70. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/async_batch.py +0 -0
  71. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/bundle_selection.py +0 -0
  72. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/checkout.py +0 -0
  73. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/collection.py +0 -0
  74. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/customer.py +0 -0
  75. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/discount.py +0 -0
  76. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/event.py +0 -0
  77. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/metafield.py +0 -0
  78. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/notification.py +0 -0
  79. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/onetime.py +0 -0
  80. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/order.py +0 -0
  81. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/payment_method.py +0 -0
  82. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/plan.py +0 -0
  83. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/product.py +0 -0
  84. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/retention_strategy.py +0 -0
  85. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/store.py +0 -0
  86. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/subscription.py +0 -0
  87. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/token.py +0 -0
  88. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/model/v2/webhook.py +0 -0
  89. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/pagination.py +0 -0
  90. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/retry.py +0 -0
  91. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/transport.py +0 -0
  92. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge/types.py +0 -0
  93. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge_api.egg-info/SOURCES.txt +0 -0
  94. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge_api.egg-info/dependency_links.txt +0 -0
  95. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge_api.egg-info/requires.txt +0 -0
  96. {recharge_api-2.0.0 → recharge_api-2.0.2}/recharge_api.egg-info/top_level.txt +0 -0
  97. {recharge_api-2.0.0 → recharge_api-2.0.2}/setup.cfg +0 -0
  98. {recharge_api-2.0.0 → recharge_api-2.0.2}/tests/test_client.py +0 -0
  99. {recharge_api-2.0.0 → recharge_api-2.0.2}/tests/test_pagination.py +0 -0
  100. {recharge_api-2.0.0 → recharge_api-2.0.2}/tests/test_retry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recharge-api
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Python API Client for Recharge
5
5
  Author-email: ChemicalLuck <j.tebbett@outlook.com>
6
6
  Project-URL: Homepage, http://github.com/ChemicalLuck/recharge-api
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "recharge-api"
3
- version = "2.0.0"
3
+ version = "2.0.2"
4
4
  authors = [
5
5
  { name="ChemicalLuck", email="j.tebbett@outlook.com" }
6
6
  ]
@@ -66,7 +66,7 @@ class RechargeAPI:
66
66
  from recharge.api.v1 import TokenResource
67
67
 
68
68
  token = TokenResource(self.client)
69
- self.scopes: list[RechargeScope] = token.get()["scopes"]
69
+ self.scopes: list[RechargeScope] = token.get().scopes
70
70
 
71
71
  self.v1 = RechargeAPIv1(self.client, self.scopes)
72
72
  self.v2 = RechargeAPIv2(self.client, self.scopes)
@@ -222,7 +222,7 @@ class AddressResource(RechargeResource):
222
222
  data = self._http_post(url, body)
223
223
  if not isinstance(data, dict):
224
224
  raise RechargeAPIError(f"Expected dict, got {type(data).__name__}")
225
- return AddressValidateResponse.model_validate(data)
225
+ return data
226
226
 
227
227
  def apply_discount(
228
228
  self,
@@ -136,7 +136,6 @@ class CustomerResource(RechargeResource):
136
136
  https://developer.rechargepayments.com/2021-01/customers/customers_list
137
137
  """
138
138
  required_scopes: list[RechargeScope] = ["read_customers"]
139
- print(query)
140
139
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
141
140
 
142
141
  data = self._http_get(self._url, query, expected=list)
@@ -153,7 +153,7 @@ class AddressResource(RechargeResource):
153
153
  required_scopes: list[RechargeScope] = ["read_customers"]
154
154
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
155
155
 
156
- data = self._http_get(self._url, query, list)
156
+ data = self._http_get(self._url, query, expected=list)
157
157
  if not isinstance(data, list):
158
158
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
159
159
  return [Address.model_validate(address) for address in data]
@@ -188,7 +188,7 @@ class AddressResource(RechargeResource):
188
188
  https://developer.rechargepayments.com/2021-11/addresses/skip_future_charge
189
189
  """
190
190
  required_scopes: list[RechargeScope] = ["write_customers"]
191
- self._check_scopes(f"POST /{self.object_list_key}/skip", required_scopes)
191
+ self._check_scopes(f"POST /{self.object_list_key}/:address_id/charges/skip", required_scopes)
192
192
 
193
193
  url = f"{self._url}/{address_id}/charges/skip"
194
194
  data = self._http_post(url, body)
@@ -56,7 +56,7 @@ class BundleSelectionResource(RechargeResource):
56
56
  required_scopes: list[RechargeScope] = ["read_subscriptions"]
57
57
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
58
58
 
59
- data = self._http_get(self._url, query, list)
59
+ data = self._http_get(self._url, query, expected=list)
60
60
  if not isinstance(data, list):
61
61
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
62
62
  return [BundleSelection.model_validate(item) for item in data]
@@ -112,7 +112,7 @@ class ChargeResource(RechargeResource):
112
112
  required_scopes: list[RechargeScope] = ["read_orders"]
113
113
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
114
114
 
115
- data = self._http_get(self._url, query, list)
115
+ data = self._http_get(self._url, query, expected=list)
116
116
  if not isinstance(data, list):
117
117
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
118
118
  return [Charge.model_validate(item) for item in data]
@@ -230,7 +230,7 @@ class ChargeResource(RechargeResource):
230
230
  "write_customers",
231
231
  ]
232
232
  self._check_scopes(
233
- f"POST /{self.object_list_key}/:charge_id/capture", required_scopes
233
+ f"POST /{self.object_list_key}/:charge_id/capture_payment", required_scopes
234
234
  )
235
235
 
236
236
  url = f"{self._url}/{charge_id}/capture_payment"
@@ -117,7 +117,7 @@ class CollectionResource(RechargeResource):
117
117
  required_scopes: list[RechargeScope] = ["read_products"]
118
118
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
119
119
 
120
- data = self._http_get(self._url, query, list)
120
+ data = self._http_get(self._url, query, expected=list)
121
121
  if not isinstance(data, list):
122
122
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
123
123
  return [Collection.model_validate(item) for item in data]
@@ -131,7 +131,7 @@ class CustomerResource(RechargeResource):
131
131
  required_scopes: list[RechargeScope] = ["read_customers"]
132
132
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
133
133
 
134
- data = self._http_get(self._url, query, list)
134
+ data = self._http_get(self._url, query, expected=list)
135
135
  if not isinstance(data, list):
136
136
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
137
137
  return [Customer.model_validate(item) for item in data]
@@ -127,7 +127,7 @@ class DiscountResource(RechargeResource):
127
127
  required_scopes: list[RechargeScope] = ["read_discounts"]
128
128
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
129
129
 
130
- data = self._http_get(self._url, query, list)
130
+ data = self._http_get(self._url, query, expected=list)
131
131
  if not isinstance(data, list):
132
132
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
133
133
  return [Discount.model_validate(item) for item in data]
@@ -31,7 +31,7 @@ class EventResource(RechargeResource):
31
31
  required_scopes: list[RechargeScope] = ["read_events"]
32
32
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
33
33
 
34
- data = self._http_get(self._url, query, list)
34
+ data = self._http_get(self._url, query, expected=list)
35
35
  if not isinstance(data, list):
36
36
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
37
37
  return [Event.model_validate(event) for event in data]
@@ -156,7 +156,7 @@ class MetafieldResource(RechargeResource):
156
156
  required_scopes: list[RechargeScope] = [resource_scope(resource, "read")]
157
157
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
158
158
 
159
- data = self._http_get(self._url, query, list)
159
+ data = self._http_get(self._url, query, expected=list)
160
160
  if not isinstance(data, list):
161
161
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
162
162
  return [Metafield.model_validate(metafield) for metafield in data]
@@ -126,7 +126,7 @@ class OnetimeResource(RechargeResource):
126
126
  required_scopes: list[RechargeScope] = ["read_subscriptions"]
127
127
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
128
128
 
129
- data = self._http_get(self._url, query, list)
129
+ data = self._http_get(self._url, query, expected=list)
130
130
  if not isinstance(data, list):
131
131
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
132
132
  return [Onetime.model_validate(item) for item in data]
@@ -134,7 +134,7 @@ class OrderResource(RechargeResource):
134
134
  required_scopes: list[RechargeScope] = ["read_orders"]
135
135
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
136
136
 
137
- data = self._http_get(self._url, query, list)
137
+ data = self._http_get(self._url, query, expected=list)
138
138
  if not isinstance(data, list):
139
139
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
140
140
  return [Order.model_validate(order) for order in data]
@@ -111,7 +111,7 @@ class PaymentMethodResource(RechargeResource):
111
111
  required_scopes: list[RechargeScope] = ["read_payment_methods"]
112
112
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
113
113
 
114
- data = self._http_get(self._url, query, list)
114
+ data = self._http_get(self._url, query, expected=list)
115
115
  if not isinstance(data, list):
116
116
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
117
117
  return [PaymentMethod.model_validate(item) for item in data]
@@ -116,7 +116,7 @@ class PlanResource(RechargeResource):
116
116
  required_scopes: list[RechargeScope] = ["read_products"]
117
117
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
118
118
 
119
- data = self._http_get(self._url, query, list)
119
+ data = self._http_get(self._url, query, expected=list)
120
120
  if not isinstance(data, list):
121
121
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
122
122
  return [Plan.model_validate(item) for item in data]
@@ -115,7 +115,7 @@ class ProductResource(RechargeResource):
115
115
  required_scopes: list[RechargeScope] = ["read_products"]
116
116
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
117
117
 
118
- data = self._http_get(self._url, query, list)
118
+ data = self._http_get(self._url, query, expected=list)
119
119
  if not isinstance(data, list):
120
120
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
121
121
  return [Product.model_validate(item) for item in data]
@@ -194,7 +194,7 @@ class SubscriptionResource(RechargeResource):
194
194
  required_scopes: list[RechargeScope] = ["read_subscriptions"]
195
195
  self._check_scopes(f"GET /{self.object_list_key}", required_scopes)
196
196
 
197
- data = self._http_get(self._url, query, list)
197
+ data = self._http_get(self._url, query, expected=list)
198
198
  if not isinstance(data, list):
199
199
  raise RechargeAPIError(f"Expected list, got {type(data).__name__}")
200
200
  return [Subscription.model_validate(item) for item in data]
@@ -1,6 +1,6 @@
1
- from typing import Literal, Optional
1
+ from typing import Any, Literal, Optional, Union
2
2
 
3
- from pydantic import BaseModel, ConfigDict
3
+ from pydantic import BaseModel, ConfigDict, field_validator
4
4
 
5
5
  ChargeStatus = Literal[
6
6
  "SUCCESS", "QUEUED", "ERROR", "REFUNDED", "PARTIALLY_REFUNDED", "SKIPPED"
@@ -26,6 +26,13 @@ class ChargeAnalyticsData(BaseModel):
26
26
 
27
27
  utm_params: Optional[ChargeAnalyticsDataUtmParams] = None
28
28
 
29
+ @field_validator("utm_params", mode="before")
30
+ @classmethod
31
+ def coerce_utm_params(cls, v: Any) -> Any:
32
+ if isinstance(v, list):
33
+ return None
34
+ return v
35
+
29
36
 
30
37
  class ChargeBillingAddress(BaseModel):
31
38
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -153,7 +160,7 @@ class ChargeOrderAttribute(BaseModel):
153
160
  model_config = ConfigDict(extra="allow", populate_by_name=True)
154
161
 
155
162
  name: str
156
- value: str
163
+ value: Optional[str] = None
157
164
 
158
165
 
159
166
  class ChargeShippingAddress(BaseModel):
@@ -178,13 +185,27 @@ class ChargeShippingLine(BaseModel):
178
185
  price: Optional[str] = None
179
186
  source: Optional[str] = None
180
187
  title: Optional[str] = None
181
- taxable: Optional[str] = None
188
+ taxable: Optional[Union[str, bool]] = None
182
189
  tax_lines: list[ChargeTaxLine] = []
183
190
 
184
191
 
185
192
  class Charge(BaseModel):
186
193
  model_config = ConfigDict(extra="allow", populate_by_name=True)
187
194
 
195
+ @field_validator("status", "type", mode="before")
196
+ @classmethod
197
+ def uppercase_literals(cls, v: Any) -> Any:
198
+ if isinstance(v, str):
199
+ return v.upper()
200
+ return v
201
+
202
+ @field_validator("tags", mode="before")
203
+ @classmethod
204
+ def coerce_tags(cls, v: Any) -> Any:
205
+ if isinstance(v, str):
206
+ return [t.strip() for t in v.split(",") if t.strip()]
207
+ return v
208
+
188
209
  id: int
189
210
  address_id: Optional[int] = None
190
211
  analytics_data: Optional[ChargeAnalyticsData] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recharge-api
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Python API Client for Recharge
5
5
  Author-email: ChemicalLuck <j.tebbett@outlook.com>
6
6
  Project-URL: Homepage, http://github.com/ChemicalLuck/recharge-api
File without changes
File without changes
File without changes