shopware-api-client 1.0.101__py3-none-any.whl → 1.1.1__py3-none-any.whl

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 (292) hide show
  1. shopware_api_client/base.py +490 -202
  2. shopware_api_client/cache.py +157 -0
  3. shopware_api_client/client.py +2 -2
  4. shopware_api_client/config.py +4 -3
  5. shopware_api_client/endpoints/admin/__init__.py +20 -4
  6. shopware_api_client/endpoints/admin/commercial/b2b_components_role.py +5 -20
  7. shopware_api_client/endpoints/admin/commercial/b2b_components_shopping_list.py +22 -0
  8. shopware_api_client/endpoints/admin/commercial/b2b_components_shopping_list_line_item.py +20 -0
  9. shopware_api_client/endpoints/admin/commercial/b2b_employee.py +5 -27
  10. shopware_api_client/endpoints/admin/commercial/dynamic_access.py +9 -19
  11. shopware_api_client/endpoints/admin/core/acl_role.py +5 -19
  12. shopware_api_client/endpoints/admin/core/api_info.py +11 -12
  13. shopware_api_client/endpoints/admin/core/app.py +5 -42
  14. shopware_api_client/endpoints/admin/core/app_script_condition.py +5 -24
  15. shopware_api_client/endpoints/admin/core/category.py +5 -56
  16. shopware_api_client/endpoints/admin/core/cms_block.py +5 -34
  17. shopware_api_client/endpoints/admin/core/cms_page.py +5 -26
  18. shopware_api_client/endpoints/admin/core/cms_section.py +5 -35
  19. shopware_api_client/endpoints/admin/core/cms_slot.py +5 -31
  20. shopware_api_client/endpoints/admin/core/country.py +5 -37
  21. shopware_api_client/endpoints/admin/core/country_state.py +5 -23
  22. shopware_api_client/endpoints/admin/core/currency.py +5 -33
  23. shopware_api_client/endpoints/admin/core/currency_country_rounding.py +5 -20
  24. shopware_api_client/endpoints/admin/core/custom_entity.py +4 -26
  25. shopware_api_client/endpoints/admin/core/custom_field.py +4 -14
  26. shopware_api_client/endpoints/admin/core/customer.py +5 -57
  27. shopware_api_client/endpoints/admin/core/customer_address.py +6 -33
  28. shopware_api_client/endpoints/admin/core/customer_group.py +5 -24
  29. shopware_api_client/endpoints/admin/core/customer_recovery.py +5 -16
  30. shopware_api_client/endpoints/admin/core/customer_wishlist.py +5 -19
  31. shopware_api_client/endpoints/admin/core/customer_wishlist_product.py +5 -19
  32. shopware_api_client/endpoints/admin/core/delivery_time.py +5 -21
  33. shopware_api_client/endpoints/admin/core/document.py +5 -28
  34. shopware_api_client/endpoints/admin/core/document_base_config.py +5 -27
  35. shopware_api_client/endpoints/admin/core/document_base_config_sales_channel.py +7 -20
  36. shopware_api_client/endpoints/admin/core/document_type.py +5 -19
  37. shopware_api_client/endpoints/admin/core/integration.py +5 -25
  38. shopware_api_client/endpoints/admin/core/landing_page.py +5 -28
  39. shopware_api_client/endpoints/admin/core/language.py +5 -21
  40. shopware_api_client/endpoints/admin/core/locale.py +5 -20
  41. shopware_api_client/endpoints/admin/core/main_category.py +5 -19
  42. shopware_api_client/endpoints/admin/core/media.py +25 -37
  43. shopware_api_client/endpoints/admin/core/media_default_folder.py +4 -17
  44. shopware_api_client/endpoints/admin/core/media_folder.py +5 -26
  45. shopware_api_client/endpoints/admin/core/media_folder_configuration.py +5 -21
  46. shopware_api_client/endpoints/admin/core/media_thumbnail.py +5 -24
  47. shopware_api_client/endpoints/admin/core/media_thumbnail_size.py +7 -18
  48. shopware_api_client/endpoints/admin/core/order.py +12 -48
  49. shopware_api_client/endpoints/admin/core/order_address.py +6 -34
  50. shopware_api_client/endpoints/admin/core/order_customer.py +6 -29
  51. shopware_api_client/endpoints/admin/core/order_delivery.py +5 -30
  52. shopware_api_client/endpoints/admin/core/order_delivery_position.py +5 -26
  53. shopware_api_client/endpoints/admin/core/order_line_item.py +7 -44
  54. shopware_api_client/endpoints/admin/core/order_line_item_download.py +5 -23
  55. shopware_api_client/endpoints/admin/core/order_transaction.py +5 -25
  56. shopware_api_client/endpoints/admin/core/order_transaction_capture.py +5 -27
  57. shopware_api_client/endpoints/admin/core/order_transaction_capture_refund.py +7 -28
  58. shopware_api_client/endpoints/admin/core/order_transaction_capture_refund_position.py +8 -29
  59. shopware_api_client/endpoints/admin/core/payment_method.py +5 -52
  60. shopware_api_client/endpoints/admin/core/product.py +24 -90
  61. shopware_api_client/endpoints/admin/core/product_configurator_setting.py +5 -26
  62. shopware_api_client/endpoints/admin/core/product_cross_selling.py +5 -27
  63. shopware_api_client/endpoints/admin/core/product_cross_selling_assigned_products.py +7 -21
  64. shopware_api_client/endpoints/admin/core/product_download.py +5 -22
  65. shopware_api_client/endpoints/admin/core/product_export.py +5 -34
  66. shopware_api_client/endpoints/admin/core/product_feature_set.py +5 -19
  67. shopware_api_client/endpoints/admin/core/product_manufacturer.py +5 -23
  68. shopware_api_client/endpoints/admin/core/product_media.py +5 -22
  69. shopware_api_client/endpoints/admin/core/product_price.py +5 -24
  70. shopware_api_client/endpoints/admin/core/product_review.py +5 -29
  71. shopware_api_client/endpoints/admin/core/product_search_keyword.py +5 -20
  72. shopware_api_client/endpoints/admin/core/product_stream.py +5 -23
  73. shopware_api_client/endpoints/admin/core/product_visibility.py +5 -18
  74. shopware_api_client/endpoints/admin/core/product_warehouse.py +5 -17
  75. shopware_api_client/endpoints/admin/core/promotion.py +5 -38
  76. shopware_api_client/endpoints/admin/core/promotion_discount.py +5 -24
  77. shopware_api_client/endpoints/admin/core/promotion_discount_prices.py +5 -19
  78. shopware_api_client/endpoints/admin/core/property_group.py +5 -24
  79. shopware_api_client/endpoints/admin/core/property_group_option.py +5 -23
  80. shopware_api_client/endpoints/admin/core/rule.py +5 -24
  81. shopware_api_client/endpoints/admin/core/rule_condition.py +5 -23
  82. shopware_api_client/endpoints/admin/core/sales_channel.py +6 -53
  83. shopware_api_client/endpoints/admin/core/sales_channel_domain.py +5 -23
  84. shopware_api_client/endpoints/admin/core/salutation.py +5 -20
  85. shopware_api_client/endpoints/admin/core/seo_url.py +5 -30
  86. shopware_api_client/endpoints/admin/core/shipping_method.py +8 -30
  87. shopware_api_client/endpoints/admin/core/shipping_method_price.py +20 -0
  88. shopware_api_client/endpoints/admin/core/state_machine.py +5 -21
  89. shopware_api_client/endpoints/admin/core/state_machine_history.py +5 -25
  90. shopware_api_client/endpoints/admin/core/state_machine_state.py +6 -20
  91. shopware_api_client/endpoints/admin/core/state_machine_transition.py +5 -23
  92. shopware_api_client/endpoints/admin/core/system_config.py +5 -19
  93. shopware_api_client/endpoints/admin/core/tag.py +5 -14
  94. shopware_api_client/endpoints/admin/core/tax.py +5 -21
  95. shopware_api_client/endpoints/admin/core/tax_rule.py +5 -22
  96. shopware_api_client/endpoints/admin/core/tax_rule_type.py +5 -21
  97. shopware_api_client/endpoints/admin/core/unit.py +5 -19
  98. shopware_api_client/endpoints/admin/core/user.py +5 -31
  99. shopware_api_client/endpoints/admin/core/warehouse.py +5 -15
  100. shopware_api_client/endpoints/admin/core/warehouse_group.py +6 -18
  101. shopware_api_client/endpoints/admin/core/warehouse_group_warehouse.py +6 -18
  102. shopware_api_client/endpoints/base_fields.py +13 -22
  103. shopware_api_client/endpoints/relations.py +36 -24
  104. shopware_api_client/endpoints/store/__init__.py +37 -4
  105. shopware_api_client/endpoints/store/core/address.py +51 -68
  106. shopware_api_client/endpoints/store/core/cart.py +39 -85
  107. shopware_api_client/endpoints/store/core/category.py +16 -0
  108. shopware_api_client/endpoints/store/core/cms_block.py +10 -0
  109. shopware_api_client/endpoints/store/core/cms_page.py +12 -0
  110. shopware_api_client/endpoints/store/core/cms_section.py +12 -0
  111. shopware_api_client/endpoints/store/core/cms_slot.py +8 -0
  112. shopware_api_client/endpoints/store/core/context.py +58 -0
  113. shopware_api_client/endpoints/store/core/country.py +15 -0
  114. shopware_api_client/endpoints/store/core/country_state.py +19 -0
  115. shopware_api_client/endpoints/store/core/currency.py +12 -0
  116. shopware_api_client/endpoints/store/core/customer.py +34 -0
  117. shopware_api_client/endpoints/store/core/customer_group.py +5 -0
  118. shopware_api_client/endpoints/store/core/delivery_time.py +5 -0
  119. shopware_api_client/endpoints/store/core/document.py +15 -0
  120. shopware_api_client/endpoints/store/core/document_type.py +5 -0
  121. shopware_api_client/endpoints/store/core/landing_page.py +10 -0
  122. shopware_api_client/endpoints/store/core/language.py +18 -0
  123. shopware_api_client/endpoints/store/core/locale.py +5 -0
  124. shopware_api_client/endpoints/store/core/main_category.py +5 -0
  125. shopware_api_client/endpoints/store/core/media.py +8 -0
  126. shopware_api_client/endpoints/store/core/media_thumbnail.py +5 -0
  127. shopware_api_client/endpoints/store/core/order.py +67 -0
  128. shopware_api_client/endpoints/store/core/order_address.py +12 -0
  129. shopware_api_client/endpoints/store/core/order_customer.py +8 -0
  130. shopware_api_client/endpoints/store/core/order_delivery.py +14 -0
  131. shopware_api_client/endpoints/store/core/order_delivery_position.py +5 -0
  132. shopware_api_client/endpoints/store/core/order_line_item.py +14 -0
  133. shopware_api_client/endpoints/store/core/order_transaction.py +12 -0
  134. shopware_api_client/endpoints/store/core/order_transaction_capture.py +12 -0
  135. shopware_api_client/endpoints/store/core/order_transaction_capture_refund.py +12 -0
  136. shopware_api_client/endpoints/store/core/order_transaction_capture_refund_position.py +11 -0
  137. shopware_api_client/endpoints/store/core/payment_method.py +8 -0
  138. shopware_api_client/endpoints/store/core/product.py +60 -0
  139. shopware_api_client/endpoints/store/core/product_configurator_setting.py +10 -0
  140. shopware_api_client/endpoints/store/core/product_cross_selling.py +5 -0
  141. shopware_api_client/endpoints/store/core/product_download.py +10 -0
  142. shopware_api_client/endpoints/store/core/product_manufacturer.py +8 -0
  143. shopware_api_client/endpoints/store/core/product_media.py +10 -0
  144. shopware_api_client/endpoints/store/core/product_review.py +5 -0
  145. shopware_api_client/endpoints/store/core/product_stream.py +5 -0
  146. shopware_api_client/endpoints/store/core/property_group.py +8 -0
  147. shopware_api_client/endpoints/store/core/property_group_option.py +10 -0
  148. shopware_api_client/endpoints/store/core/rule.py +5 -0
  149. shopware_api_client/endpoints/store/core/sales_channel.py +23 -0
  150. shopware_api_client/endpoints/store/core/sales_channel_domain.py +12 -0
  151. shopware_api_client/endpoints/store/core/salutation.py +12 -0
  152. shopware_api_client/endpoints/store/core/seo_url.py +5 -0
  153. shopware_api_client/endpoints/store/core/shipping_method.py +18 -0
  154. shopware_api_client/endpoints/store/core/shipping_method_price.py +5 -0
  155. shopware_api_client/endpoints/store/core/state_machine_state.py +5 -0
  156. shopware_api_client/endpoints/store/core/tag.py +5 -0
  157. shopware_api_client/endpoints/store/core/tax.py +5 -0
  158. shopware_api_client/endpoints/store/core/unit.py +5 -0
  159. shopware_api_client/exceptions.py +21 -1
  160. shopware_api_client/fieldsets.py +12 -0
  161. shopware_api_client/models/__init__.py +0 -0
  162. shopware_api_client/models/acl_role.py +11 -0
  163. shopware_api_client/models/app.py +33 -0
  164. shopware_api_client/models/app_script_condition.py +16 -0
  165. shopware_api_client/models/b2b_components_role.py +12 -0
  166. shopware_api_client/models/b2b_components_shopping_list.py +13 -0
  167. shopware_api_client/models/b2b_components_shopping_list_line_item.py +14 -0
  168. shopware_api_client/models/b2b_employee.py +17 -0
  169. shopware_api_client/models/category.py +44 -0
  170. shopware_api_client/models/cms_block.py +23 -0
  171. shopware_api_client/models/cms_page.py +15 -0
  172. shopware_api_client/models/cms_section.py +20 -0
  173. shopware_api_client/models/cms_slot.py +17 -0
  174. shopware_api_client/models/country.py +27 -0
  175. shopware_api_client/models/country_state.py +12 -0
  176. shopware_api_client/models/currency.py +20 -0
  177. shopware_api_client/models/currency_country_rounding.py +11 -0
  178. shopware_api_client/models/custom_entity.py +19 -0
  179. shopware_api_client/models/custom_field.py +8 -0
  180. shopware_api_client/models/customer.py +47 -0
  181. shopware_api_client/models/customer_address.py +22 -0
  182. shopware_api_client/models/customer_group.py +13 -0
  183. shopware_api_client/models/customer_recovery.py +9 -0
  184. shopware_api_client/models/customer_wishlist.py +9 -0
  185. shopware_api_client/models/customer_wishlist_product.py +10 -0
  186. shopware_api_client/models/delivery_time.py +12 -0
  187. shopware_api_client/models/document.py +20 -0
  188. shopware_api_client/models/document_base_config.py +19 -0
  189. shopware_api_client/models/document_base_config_sales_channel.py +10 -0
  190. shopware_api_client/models/document_type.py +8 -0
  191. shopware_api_client/models/dynamic_access.py +9 -0
  192. shopware_api_client/models/integration.py +15 -0
  193. shopware_api_client/models/landing_page.py +15 -0
  194. shopware_api_client/models/language.py +11 -0
  195. shopware_api_client/models/locale.py +9 -0
  196. shopware_api_client/models/main_category.py +12 -0
  197. shopware_api_client/models/media.py +26 -0
  198. shopware_api_client/models/media_default_folder.py +7 -0
  199. shopware_api_client/models/media_folder.py +16 -0
  200. shopware_api_client/models/media_folder_configuration.py +11 -0
  201. shopware_api_client/models/media_thumbnail.py +15 -0
  202. shopware_api_client/models/media_thumbnail_size.py +8 -0
  203. shopware_api_client/models/order.py +36 -0
  204. shopware_api_client/models/order_address.py +23 -0
  205. shopware_api_client/models/order_customer.py +18 -0
  206. shopware_api_client/models/order_delivery.py +19 -0
  207. shopware_api_client/models/order_delivery_position.py +15 -0
  208. shopware_api_client/models/order_line_item.py +34 -0
  209. shopware_api_client/models/order_line_item_download.py +12 -0
  210. shopware_api_client/models/order_transaction.py +15 -0
  211. shopware_api_client/models/order_transaction_capture.py +15 -0
  212. shopware_api_client/models/order_transaction_capture_refund.py +16 -0
  213. shopware_api_client/models/order_transaction_capture_refund_position.py +15 -0
  214. shopware_api_client/models/payment_method.py +29 -0
  215. shopware_api_client/models/product.py +72 -0
  216. shopware_api_client/models/product_configurator_setting.py +14 -0
  217. shopware_api_client/models/product_cross_selling.py +17 -0
  218. shopware_api_client/models/product_cross_selling_assigned_products.py +11 -0
  219. shopware_api_client/models/product_download.py +11 -0
  220. shopware_api_client/models/product_export.py +27 -0
  221. shopware_api_client/models/product_feature_set.py +11 -0
  222. shopware_api_client/models/product_manufacturer.py +11 -0
  223. shopware_api_client/models/product_media.py +11 -0
  224. shopware_api_client/models/product_price.py +15 -0
  225. shopware_api_client/models/product_review.py +19 -0
  226. shopware_api_client/models/product_search_keyword.py +13 -0
  227. shopware_api_client/models/product_stream.py +14 -0
  228. shopware_api_client/models/product_visibility.py +11 -0
  229. shopware_api_client/models/product_warehouse.py +10 -0
  230. shopware_api_client/models/promotion.py +29 -0
  231. shopware_api_client/models/promotion_discount.py +17 -0
  232. shopware_api_client/models/promotion_discount_prices.py +10 -0
  233. shopware_api_client/models/property_group.py +13 -0
  234. shopware_api_client/models/property_group_option.py +12 -0
  235. shopware_api_client/models/rule.py +16 -0
  236. shopware_api_client/models/rule_condition.py +15 -0
  237. shopware_api_client/models/sales_channel.py +44 -0
  238. shopware_api_client/models/sales_channel_domain.py +13 -0
  239. shopware_api_client/models/salutation.py +9 -0
  240. shopware_api_client/models/seo_url.py +19 -0
  241. shopware_api_client/models/shipping_method.py +18 -0
  242. shopware_api_client/models/shipping_method_price.py +15 -0
  243. shopware_api_client/models/state_machine.py +10 -0
  244. shopware_api_client/models/state_machine_history.py +18 -0
  245. shopware_api_client/models/state_machine_state.py +8 -0
  246. shopware_api_client/models/state_machine_transition.py +11 -0
  247. shopware_api_client/models/system_config.py +12 -0
  248. shopware_api_client/models/tag.py +7 -0
  249. shopware_api_client/models/tax.py +9 -0
  250. shopware_api_client/models/tax_rule.py +15 -0
  251. shopware_api_client/models/tax_rule_type.py +11 -0
  252. shopware_api_client/models/unit.py +8 -0
  253. shopware_api_client/models/user.py +21 -0
  254. shopware_api_client/models/warehouse.py +8 -0
  255. shopware_api_client/models/warehouse_group.py +11 -0
  256. shopware_api_client/models/warehouse_group_warehouse.py +11 -0
  257. shopware_api_client/structs/__init__.py +0 -0
  258. shopware_api_client/structs/absolute_price_definition.py +6 -0
  259. shopware_api_client/structs/calculated_cheapest_price.py +6 -0
  260. shopware_api_client/structs/calculated_price.py +17 -0
  261. shopware_api_client/structs/calculated_tax.py +8 -0
  262. shopware_api_client/structs/cart.py +21 -0
  263. shopware_api_client/structs/cart_price.py +15 -0
  264. shopware_api_client/structs/cash_rounding_config.py +7 -0
  265. shopware_api_client/structs/context.py +15 -0
  266. shopware_api_client/structs/delivery.py +16 -0
  267. shopware_api_client/structs/delivery_date.py +8 -0
  268. shopware_api_client/structs/delivery_information.py +13 -0
  269. shopware_api_client/structs/delivery_position.py +12 -0
  270. shopware_api_client/structs/delivery_time.py +8 -0
  271. shopware_api_client/structs/language_info.py +6 -0
  272. shopware_api_client/structs/line_item.py +39 -0
  273. shopware_api_client/structs/list_price.py +7 -0
  274. shopware_api_client/structs/measurement_units.py +8 -0
  275. shopware_api_client/structs/percentage_price_definition.py +6 -0
  276. shopware_api_client/structs/price.py +14 -0
  277. shopware_api_client/structs/quantity_information.py +7 -0
  278. shopware_api_client/structs/quantity_price_definition.py +14 -0
  279. shopware_api_client/structs/reference_price.py +5 -0
  280. shopware_api_client/structs/reference_price_definition.py +7 -0
  281. shopware_api_client/structs/regulation_price.py +5 -0
  282. shopware_api_client/structs/sales_channel_context.py +33 -0
  283. shopware_api_client/structs/shipping_location.py +12 -0
  284. shopware_api_client/structs/tax_free_config.py +8 -0
  285. shopware_api_client/structs/tax_rule.py +6 -0
  286. shopware_api_client/structs/transaction.py +8 -0
  287. shopware_api_client/structs/variant_listing_config.py +8 -0
  288. {shopware_api_client-1.0.101.dist-info → shopware_api_client-1.1.1.dist-info}/METADATA +89 -275
  289. shopware_api_client-1.1.1.dist-info/RECORD +298 -0
  290. {shopware_api_client-1.0.101.dist-info → shopware_api_client-1.1.1.dist-info}/WHEEL +1 -1
  291. shopware_api_client-1.0.101.dist-info/RECORD +0 -114
  292. {shopware_api_client-1.0.101.dist-info → shopware_api_client-1.1.1.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,14 @@
1
+ from typing import Any
2
+
3
+ from shopware_api_client.endpoints.base_fields import IdField
4
+ from shopware_api_client.fieldsets import FieldSetBase
5
+
6
+
7
+ class Price(FieldSetBase):
8
+ currency_id: IdField
9
+ gross: float
10
+ net: float
11
+ linked: bool
12
+ list_price: "Price | None" = None
13
+ regulation_price: "Price | None" = None
14
+ percentage: list[Any] | dict[str, Any] | None = None
@@ -0,0 +1,7 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+
3
+
4
+ class QuantityInformation(FieldSetBase):
5
+ max_purchase: int | None = None
6
+ min_purchase: int | None = 1
7
+ purchase_steps: int | None = 1
@@ -0,0 +1,14 @@
1
+ from .reference_price_definition import ReferencePriceDefinition
2
+ from .tax_rule import TaxRule
3
+ from ..fieldsets import FieldSetBase
4
+
5
+
6
+ class QuantityPriceDefinition(FieldSetBase):
7
+ type: str = "quantitiy"
8
+ is_calculated: bool = True
9
+ reference_price_definition: ReferencePriceDefinition | None = None
10
+ list_price: float | None = None
11
+ regulation_price: float | None = None
12
+ price: float
13
+ tax_rules: list[TaxRule]
14
+ quantity: int = 1
@@ -0,0 +1,5 @@
1
+ from shopware_api_client.structs.reference_price_definition import ReferencePriceDefinition
2
+
3
+
4
+ class ReferencePrice(ReferencePriceDefinition):
5
+ price: float
@@ -0,0 +1,7 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+
3
+
4
+ class ReferencePriceDefinition(FieldSetBase):
5
+ purchase_unit: float
6
+ reference_unit: float
7
+ unit_name: str
@@ -0,0 +1,5 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+
3
+
4
+ class RegulationPrice(FieldSetBase):
5
+ price: float
@@ -0,0 +1,33 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+
3
+ from shopware_api_client.endpoints.store.core.currency import Currency
4
+ from shopware_api_client.endpoints.store.core.customer import Customer
5
+ from shopware_api_client.endpoints.store.core.customer_group import CustomerGroup
6
+ from shopware_api_client.endpoints.store.core.payment_method import PaymentMethod
7
+ from shopware_api_client.endpoints.store.core.sales_channel import SalesChannel
8
+ from shopware_api_client.endpoints.store.core.shipping_method import ShippingMethod
9
+ from shopware_api_client.endpoints.store.core.tax import Tax
10
+
11
+ from .cash_rounding_config import CashRoundingConfig
12
+ from .context import Context
13
+ from .language_info import LanguageInfo
14
+ from .measurement_units import MeasurementUnits
15
+ from .shipping_location import ShippingLocation
16
+
17
+
18
+ class SalesChannelContext(FieldSetBase):
19
+ token: str | None = None
20
+ current_customer_group: CustomerGroup | None = None
21
+ fallback_customer_group: CustomerGroup | None = None
22
+ currency: Currency | None = None
23
+ sales_channel: SalesChannel
24
+ measurementSystem: MeasurementUnits | None = None
25
+ tax_rules: list[Tax] | None = None
26
+ customer: Customer | None = None
27
+ payment_method: PaymentMethod | None = None
28
+ shipping_location: ShippingLocation | None = None
29
+ shipping_method: ShippingMethod | None = None
30
+ context: Context | None = None
31
+ item_rounding: CashRoundingConfig
32
+ total_rounding: CashRoundingConfig
33
+ language_info: LanguageInfo
@@ -0,0 +1,12 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+
3
+
4
+ class ShippingLocation(FieldSetBase):
5
+ country: "Country | None" = None
6
+ address: "Address | None" = None
7
+ state: "CountryState | None" = None
8
+
9
+
10
+ from ..endpoints.store.core.address import Address # noqa: E402
11
+ from ..endpoints.store.core.country import Country # noqa: E402
12
+ from ..endpoints.store.core.country_state import CountryState # noqa: E402
@@ -0,0 +1,8 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+ from shopware_api_client.endpoints.base_fields import IdField
3
+
4
+
5
+ class TaxFreeConfig(FieldSetBase):
6
+ enabled: bool = False
7
+ currency_id: IdField
8
+ amount: float = 0
@@ -0,0 +1,6 @@
1
+ from shopware_api_client.fieldsets import FieldSetBase
2
+
3
+
4
+ class TaxRule(FieldSetBase):
5
+ tax_rate: float
6
+ percentage: float = 100
@@ -0,0 +1,8 @@
1
+ from .calculated_price import CalculatedPrice
2
+ from ..endpoints.base_fields import IdField
3
+ from ..fieldsets import FieldSetBase
4
+
5
+
6
+ class Transaction(FieldSetBase):
7
+ payment_method_id: IdField | None = None
8
+ amount: CalculatedPrice | None = None
@@ -0,0 +1,8 @@
1
+ from typing import Any
2
+ from shopware_api_client.fieldsets import FieldSetBase
3
+
4
+
5
+ class VariantListingConfig(FieldSetBase):
6
+ display_parent: bool | None = None
7
+ main_variant_id: str | None = None
8
+ configurator_group_config: list[Any] | dict[str, Any] | None = None
@@ -1,8 +1,9 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: shopware-api-client
3
- Version: 1.0.101
3
+ Version: 1.1.1
4
4
  Summary: An api client for the Shopware API
5
5
  License: MIT
6
+ License-File: LICENSE
6
7
  Keywords: shopware,api,client
7
8
  Author: GWS Gesellschaft für Warenwirtschafts-Systeme mbH
8
9
  Author-email: ebusiness@gws.ms
@@ -12,10 +13,13 @@ Classifier: Operating System :: OS Independent
12
13
  Classifier: Programming Language :: Python :: 3
13
14
  Classifier: Programming Language :: Python :: 3.12
14
15
  Classifier: Programming Language :: Python :: 3.13
15
- Requires-Dist: httpx (>=0.26,<0.27)
16
- Requires-Dist: httpx-auth (>=0.21,<0.22)
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Provides-Extra: redis
18
+ Requires-Dist: httpx (>=0.28,<0.29)
19
+ Requires-Dist: httpx-auth (>=0.23,<0.24)
17
20
  Requires-Dist: pydantic (>=2.6,<3.0)
18
21
  Requires-Dist: pytest-random-order (>=1.1.1,<2.0.0)
22
+ Requires-Dist: redis (>5.0,<7.0) ; extra == "redis"
19
23
  Project-URL: Bugtracker, https://github.com/GWS-mbH/shopware-api-client/issues
20
24
  Project-URL: Changelog, https://github.com/GWS-mbH/shopware-api-client
21
25
  Project-URL: Documentation, https://github.com/GWS-mbH/shopware-api-client/wiki
@@ -29,8 +33,13 @@ A Django-ORM like, Python 3.12, async Shopware 6 admin and store-front API clien
29
33
 
30
34
  ## Installation
31
35
 
36
+ ```sh
32
37
  pip install shopware-api-client
33
38
 
39
+ # If you want to use the redis cache
40
+ pip install shopware-api-client[redis]
41
+ ```
42
+
34
43
  ## Usage
35
44
 
36
45
  There are two kinds of clients provided by this library. The `client.AdminClient` for the Admin API and the
@@ -96,7 +105,7 @@ Endpoint:
96
105
  customer = await client.customer.first()
97
106
  ```
98
107
 
99
- All available Endpoint functions can be found in the [EndpointBase](#list-of-available-functions) section.
108
+ All available Endpoint functions can be found in the [AdminEndpoint](#list-of-available-functions) section.
100
109
 
101
110
  There are two additional ways how the client can be utilized by using it with the Endpoint-Class directly or the
102
111
  associated Pydantic Model:
@@ -151,7 +160,7 @@ await client.ce_blog.all()
151
160
 
152
161
  # Pydantic Model for the custom entity ce_blog
153
162
  CeBlog = client.ce_blog.model_class
154
- ```
163
+ ```
155
164
  Since custom entities are completely dynamic no autocompletion in IDE is available. However there are some pydantic validations added for the field-types of the custom entity. Relations are currently not supported, but everything else should work as expected.
156
165
 
157
166
  ### client.StoreClient
@@ -173,22 +182,59 @@ SHOP_URL = "https://pets24.shop"
173
182
  config = StoreConfig(url=SHOP_URL, access_key=STORE_API_ACCESS_KEY, context_token=CONTEXT_TOKEN)
174
183
  ```
175
184
 
176
- This config can be used with the `StoreClient`, which works exactly like the `AdminClient`.
185
+ This config can be used with the `StoreClient`, ~~which works exactly like the `AdminClient`~~.
186
+ The `StoreClient` has far less endpoints and does mostly not support full updated of models, but uses
187
+ helper-functions.
188
+
189
+ ### Redis Caching for Rate Limits
190
+
191
+ Both the AdminClient and the StoreClient use a built-in rate limiter. Shopware's rate limits differ based on the endpoints, both for the [SaaS-](https://docs.shopware.com/en/en/shopware-6-en/saas/rate-limits) and the [on-premise-solution](https://developer.shopware.com/docs/guides/hosting/infrastructure/rate-limiter.html).
192
+
193
+ To be able to respect the rate limit when sending requests from multiple clients, it is possible to use redis as a cache-backend for route-based rate-limit data. If redis is not used, each Client independently keeps track of the rate limit. Please note that the non-Redis cache is not thread-safe.
194
+
195
+ To use redis, simply hand over a redis-client to the client config:
196
+ ```py
197
+ import redis
198
+ from shopware_api_client.config import AdminConfig, StoreConfig
199
+ from shopware_api_client.client import AdminClient, StoreClient
200
+
201
+ redis_client = redis.Redis()
177
202
 
178
- ## EndpointBase
179
- The `base.EndpointBase` class should be used for creating new Endpoints. It provides some usefull functions to call
203
+ admin_config = AdminConfig(
204
+ url='',
205
+ client_id='...',
206
+ client_secre='...',
207
+ redis_client=redis_client,
208
+ )
209
+ admin_client = AdminClient(config=config) # <- This client uses the redis client now
210
+
211
+ store_config = StoreConfig(
212
+ url='',
213
+ access_key='',
214
+ context_token=''
215
+ redis_client=redis_client,
216
+ )
217
+ store_client = StoreClient(config=config) # <- Works for store client as well (Only do this in safe environments)
218
+ ```
219
+
220
+ __Note:__ Shopware currently enforces rate limits on a per–public‑IP basis. As a result, you should only share Redis‑backed rate‑limit caching among clients that originate from the same public IP address.
221
+
222
+ ## AdminEndpoint
223
+ The `base.AdminEndpoint` class should be used for creating new Admin-Endpoints. It provides some usefull functions to call
180
224
  the Shopware-API.
181
225
 
182
226
  The base structure of an Endpoint is pretty simple:
183
227
 
184
228
  ```python
185
- from shopware_api_client.base import ApiModelBase, EndpointBase
229
+ from shopware_api_client.base import EndpointMixin, AdminEndpoint
186
230
 
187
- class CustomerGroup(ApiModelBase["CustomerGroupEndpoint"]):
231
+
232
+ class CustomerGroup(EndpointMixin["CustomerGroupEndpoint"]):
188
233
  # Model definition
189
234
  pass
190
235
 
191
- class CustomerGroupEndpoint(EndpointBase[CustomerGroup]):
236
+
237
+ class CustomerGroupEndpoint(AdminEndpoint[CustomerGroup]):
192
238
  name = "customer_group" # name of the Shopware-Endpoint (snaky)
193
239
  path = "/customer-group" # path of the Shopware-Endpoint
194
240
  model_class = CustomerGroup # Pydantic-Model of this Endpoint
@@ -212,6 +258,7 @@ class CustomerGroupEndpoint(EndpointBase[CustomerGroup]):
212
258
  - `bulk_delete(objs: list[ModelClass] | list[dict[str, Any]` deletes multiple objects. Does always return dict or plain response. (POST /_action/sync)
213
259
 
214
260
  Not all functions are available for the StoreClient-Endpoints. But some of them have some additional functions.
261
+ StoreClient-Endpoints using the `base.StoreSearchEndpoint` can use most of the filter functions, but not create/update/delete.
215
262
 
216
263
  ### Filter
217
264
 
@@ -248,18 +295,23 @@ The base structure of an Endpoint-Model looks like this. Field names are convert
248
295
  ```python
249
296
  from pydantic import Field
250
297
  from typing import Any
251
- from shopware_api_client.base import ApiModelBase
298
+ from shopware_api_client.base import ApiModelBase, CustomFieldsMixin
299
+
252
300
 
253
- class CustomerGroup(ApiModelBase["CustomerGroupEndpoint"]):
301
+ class CustomerGroup(ApiModelBase, CustomFieldsMixin):
254
302
  _identifier = "customer_group" # name of the Shopware-Endpoint (snaky)
255
303
 
256
304
  name: str # Field with type
257
305
  display_gross: bool | None = None
258
- custom_fields: dict[str, Any] | None = None
259
306
  # other fields...
260
307
  ```
261
308
 
262
- The `id`, `created_at` and `updated_at` attributes are provided in the ApiModelBase and must not be added.
309
+ This Base-Models live in `shopware_api_client.models`
310
+
311
+ The `id`, `version_id`, `created_at`, `updated_at` and `translated` attributes are provided in the ApiModelBase and
312
+ must not be added. This are default fields of Shopwares `Entity` class, even they are not always used.
313
+
314
+ If an entity supports the `EntityCustomFieldsTrait` you can add the `CustomFieldsMixin` to add the custom_fields field.
263
315
 
264
316
  ### List of available Function
265
317
 
@@ -267,7 +319,7 @@ The `id`, `created_at` and `updated_at` attributes are provided in the ApiModelB
267
319
  - `delete()` executes `Endpoint.delete()`
268
320
 
269
321
 
270
- ### Relations
322
+ ### AdminModel + Relations
271
323
 
272
324
  To make relations to other models work, we have to define them in the Model. There are two classes to make this work:
273
325
  `endpoints.relations.ForeignRelation` and `endpoints.relations.ManyRelation`.
@@ -280,39 +332,35 @@ relation links.
280
332
  - `class`: Class of the related model
281
333
 
282
334
  Example (Customer):
335
+
283
336
  ```python
284
337
  from pydantic import Field
285
- from typing import TYPE_CHECKING
286
338
 
287
- from shopware_api_client.base import ApiModelBase, EndpointClass
339
+ from shopware_api_client.base import AdminModel
340
+ from shopware_api_client.endpoints.base_fields import IdField
288
341
  from shopware_api_client.endpoints.relations import ForeignRelation, ManyRelation
342
+ from shopware_api_client.models.customer import Customer as CustomerBase
289
343
 
290
- from ...base_fields import IdField
291
-
292
- if TYPE_CHECKING:
293
- from shopware_api_client.endpoints.admin import CustomerAddress
294
-
295
- # Base-Class for the normal model fields
296
- class CustomerBase(ApiModelBase[EndpointClass]):
344
+ """
345
+ // shopware_api_client.models.customer.Customer:
346
+ class Customer(ApiModelBase):
297
347
  # we have an id so we can create a ForeignRelation to it
298
348
  default_billing_address_id: IdField
349
+ """
299
350
 
300
-
301
- # Relations-Class for the related fields
302
- class CustomerRelations:
351
+ # final model containing relations for admin api. Must be AdminModel
352
+ class Customer(CustomerBase, AdminModel["CustomerEndpoint"]):
303
353
  default_billing_address: ForeignRelation["CustomerAddress"]
304
354
 
305
355
  # We don't have a field for all addresses of a customer, but there is a relation for it!
306
356
  addresses: ManyRelation["CustomerAddress"]
307
357
 
358
+ # model relation classes have to be imported at the end. pydantic needs the full import (not just TYPE_CHECKING)
359
+ # and this saves us from circular imports
360
+ from shopware_api_client.endpoints.admin import CustomerAddress # noqa: E402
308
361
 
309
- # Final Class, that combines both of them
310
- class Customer(CustomerBase["CustomerEndpoint"], CustomerRelations):
311
- pass
312
362
  ```
313
363
 
314
- We have two classes `Base` and `Relations`. This way we can [reuse the Base-Model](#reusing-admin-models-for-store-endpoints).
315
-
316
364
  ## Development
317
365
 
318
366
  ### Testing
@@ -332,7 +380,7 @@ datamodel-codegen --input openapi3.json --output model_openapi3.py --snake-case-
332
380
 
333
381
  The file may look confusing at first, but you can search for Endpoint-Name + JsonApi (Example: class CustomerJsonApi)
334
382
  to get all returned fields + relationships class as an overview over the available Relations. However, the Models will
335
- need some Modifications. But it's a good start.
383
+ need some modifications. But it's a good start.
336
384
 
337
385
  Not all fields returned by the API are writeable and the API will throw an error when you try to set it. So this fields
338
386
  must have an `exclude=True` in their definition. To find out which fields need to be excluded check the Shopware
@@ -346,245 +394,8 @@ don't get cleaned away as unused imports by code-formaters/cleaners.
346
394
  We need to import all related models at the **end** of the file. If we don't add them, Pydantic fails to build the model. If we add them before
347
395
  our model definition, we run into circular imports.
348
396
 
349
- ### Step by Step Example (Admin Endpoint Media Thumbnail)
350
-
351
- 1. Create the file for the endpoint. Since Media Thumbnail is an Admin > Core Endpoint we create a file called `media_thumbnail.py` in `endpoints/admin/core/`
352
-
353
- 2. You can copy & paste the following example as a base for the new Endpoint:
354
-
355
- ```python
356
- from typing import Any
357
-
358
- from pydantic import Field
359
-
360
- from ....base import ApiModelBase, EndpointBase, EndpointClass
361
- from ...base_fields import IdField
362
- from ...relations import ForeignRelation, ManyRelation
363
-
364
-
365
- class YourModelBase(ApiModelBase[EndpointClass]):
366
- _identifier = "your_model"
367
-
368
- foreign_id: IdField
369
- # more direct fields
370
-
371
-
372
- class YourModelRelations:
373
- foreign: ForeignRelation["ForeignRelationModel"]
374
- many: ManyRelation["ManyRelationModel"]
375
-
376
-
377
- class YourModel(YourModelBase["YourModelEndpoint"], YourModelRelations):
378
- pass
379
-
380
-
381
- class YourModelEndpoint(EndpointBase[YourModel]):
382
- name = "your_model"
383
- path = "/your-model"
384
- model_class = YourModel
385
-
386
-
387
- from .foreign_relation_model import ForeignRelationModel # noqa: E402
388
- from .may_relation_model import ManyRelationModel # noqa: E402
389
-
390
- ```
391
-
392
- 3. Update the example to your needs (Media Thumbnail Example):
393
- * Replace `YourModel` with `MediaThumbnail`
394
- * Replace `your_model` with `media_thumbnail`
395
- * Replace `your-model` with `media-thumbnail`
396
-
397
- 4. Assuming you used the datamodel-codegen command above to generate datamodels you can search the file for
398
- `class MediaThumbnailJsonApi` and copy all fields except `id`, `created_at`, `updated_at` (included in ApiModelBase) and `relationships`.
399
- ID-Fields will use the type `constr(pattern=r"^[0-9a-f]{32}$")`. Replace it with `IdField` from `endpoints.base_fields`.
400
- Remove the generated alias entries, because we use a generator for this.
401
-
402
- 5. Now your `media_thumbnail.py` should look like this:
403
-
404
- ```python
405
- from typing import TYPE_CHECKING, Any, ClassVar
406
-
407
- from pydantic import Field
408
-
409
- from ....base import ApiModelBase, EndpointBase, EndpointClass
410
- from ....client import registry
411
- from ...base_fields import IdField
412
- from ...relations import ForeignRelation, ManyRelation
413
-
414
-
415
- class MediaThumbnailBase(ApiModelBase[EndpointClass]):
416
- _identifier = "media_thumbnail"
417
-
418
- media_id: IdField
419
- width: int
420
- height: int
421
- url: str | None = Field(
422
- None, description="Runtime field, cannot be used as part of the criteria."
423
- )
424
- path: str | None = None
425
- custom_fields: dict[str, Any] | None = None
426
-
427
-
428
- class MediaThumbnailRelations:
429
- foreign: ClassVar[ForeignRelation["ForeignRelationModel"]] = ForeignRelation("ForeignRelationModel", "foreign_id")
430
- many: ClassVar[ManyRelation["ManyRelationModel"]] = ManyRelation("ManyRelationModel", "manyRelation")
431
-
432
-
433
- class MediaThumbnail(MediaThumbnailBase["MediaThumbnailEndpoint"], MediaThumbnailRelations):
434
- pass
435
-
436
-
437
- class MediaThumbnailEndpoint(EndpointBase[MediaThumbnail]):
438
- name = "media_thumbnail"
439
- path = "/media-thumbnail"
440
- model_class = MediaThumbnail
441
-
442
-
443
- from .foreign_relation_model import ForeignRelationModel # noqa: E402
444
- from .may_relation_model import ManyRelationModel # noqa: E402
445
- ```
446
-
447
- 6. Next up: Relations. For this check the type of the `relationships`. `MediaThumbnail` has only one relation to `media`.
448
- If you follow the types of `media > data` you can see the actual model type in the `type` field as examples attribute: media.
449
- So it relates to the Media Endpoint.
450
- For this relation our related Field looks like this:
451
- `media: ForeignRelation["Media"]`.
452
- We add it to the Relations class.
453
-
454
- 7. Updated `media_thumbnails.py`:
455
- ```python
456
- from typing import Any
457
-
458
- from pydantic import Field
459
-
460
- from ....base import ApiModelBase, EndpointBase, EndpointClass
461
- from ...base_fields import IdField
462
- from ...relations import ForeignRelation
463
-
464
-
465
- class MediaThumbnailBase(ApiModelBase[EndpointClass]):
466
- _identifier = "media_thumbnail"
467
-
468
- media_id: IdField
469
- width: int
470
- height: int
471
- url: str | None = Field(
472
- None, description="Runtime field, cannot be used as part of the criteria."
473
- )
474
- path: str | None = None
475
- custom_fields: dict[str, Any] | None = None
476
-
477
-
478
- class MediaThumbnailRelations:
479
- media: ForeignRelation["Media"]
480
-
481
-
482
- class MediaThumbnail(MediaThumbnailBase["MediaThumbnailEndpoint"], MediaThumbnailRelations):
483
- pass
484
-
485
-
486
- class MediaThumbnailEndpoint(EndpointBase[MediaThumbnail]):
487
- name = "media_thumbnail"
488
- path = "/media-thumbnail"
489
- model_class = MediaThumbnail
490
-
491
-
492
- from .media import Media # noqa: E402
493
- ```
494
-
495
- 8. Now we have to check, which fields are read-only fields. The easiest way for this is to head to the POST section of the documentation of this Endpoint: https://shopware.stoplight.io/docs/admin-api/9724c473cce7d-create-a-new-media-thumbnail-resources
496
- All fields that aren't listed here are read-only fields. So for our example this are: width, height, path, created_at and updated_at. We need to add an `exclude=True` to this fields, to make Pydantic ignore this fields when we send them back to the
497
- API for saving or creating entries. We try to provide default values for excluded fields which are required, so we don't have to set them, when we create
498
- a new object.
499
-
500
- 9. After adding `exclude=True` our final file should look like this:
501
- ```python
502
- from typing import Any
503
-
504
- from pydantic import AwareDatetime, Field
505
-
506
- from ....base import ApiModelBase, EndpointBase, EndpointClass
507
- from ....client import registry
508
- from ...base_fields import IdField
509
- from ...relations import ForeignRelation
510
-
511
-
512
- class MediaThumbnailBase(ApiModelBase[EndpointClass]):
513
- _identifier = "media_thumbnail"
514
-
515
- media_id: IdField
516
- width: int = Field(default=0, exclude=True)
517
- height: int = Field(default=0, exclude=True)
518
- url: str | None = Field(
519
- None, description="Runtime field, cannot be used as part of the criteria."
520
- )
521
- path: str | None = Field(None, exclude=True)
522
- custom_fields: dict[str, Any] | None = None
523
-
524
-
525
- class MediaThumbnailRelations:
526
- media: ClassVar[ForeignRelation["Media"]] = ForeignRelation("Media", "media_id")
527
-
528
-
529
- class MediaThumbnail(MediaThumbnailBase["MediaThumbnailEndpoint"], MediaThumbnailRelations):
530
- pass
531
-
532
-
533
- class MediaThumbnailEndpoint(EndpointBase[MediaThumbnail]):
534
- name = "media_thumbnail"
535
- path = "/media-thumbnail"
536
- model_class = MediaThumbnail
537
-
538
-
539
- from .media import Media # noqa: E402
540
- ```
541
- 10. As final step we need to add an import for the Model to `endpoints/admin/__init__.py` and add the Model to `__all__` and to the `AdminEndpoints.init_endpoints`
542
- ```python
543
- # other imports
544
- from .core.admin.media_thumbnail import MediaThumbnail, MediaThumbnailEndpoint
545
- # more imports
546
-
547
- __all__ = [
548
- # other models
549
- "MediaThumbnail",
550
- # more models
551
- ]
552
-
553
- ...
554
-
555
- class AdminEndpoints:
556
- def init_endpoints(self, client: "AdminClient"):
557
- # other endpoints
558
- self.media_thumbnail = MediaThumbnailEndpoint(client)
559
- # more endpoints
560
- ```
561
-
562
- We are done and you are now ready to use your new endpoint! 🎉
563
-
564
- ### Reusing Admin-Models for Store-Endpoints
565
-
566
- The Store-Endpoints use the same Model structure as the Admin-Endpoints, but have no relations. Some of the related
567
- objects are added to the response directly. We can use the Base-Models from our Admin-Endpoints for this purpose:
568
-
569
- ```python
570
- from ...admin.core.country import CountryBase
571
- from ...admin.core.country_state import CountryStateBase
572
- from ...admin.core.customer_address import CustomerAddressBase
573
- from ...admin.core.salutation import SalutationBase
574
-
575
-
576
- class Address(CustomerAddressBase["AddressEndpoint"]):
577
- _identifier = "address"
578
-
579
- country: CountryBase | None = None
580
- customer_state: CountryStateBase | None = None
581
- salutation: SalutationBase | None = None
582
- ```
583
-
584
- Since country, customerState and salutation are returned in the response, we can use their Base-Models to define
585
- their types.
586
-
587
- This "related" fields should always be optional, because their value is not always returned (object-creation).
397
+ Every model has a base model that lives in `models/<model_file>.py`. This model only contains direct fields (no relations), which are used by
398
+ both endpoints (store & admin). This base models are extended in the endpoints to contain relations (`endpoints/admin/core/<model_file>.py` & `endpoints/store/core/<model_file>.py`).
588
399
 
589
400
  ### Structure
590
401
 
@@ -599,7 +410,10 @@ This "related" fields should always be optional, because their value is not alwa
599
410
  > core -- StoreAPI > Core
600
411
  > commercial -- StoreAPI > Commercial
601
412
  > digital_sales_rooms -- StoreAPI > Digital Sales Rooms
602
- base.py -- All the Base Classes
413
+ > models -- base models to be extended in admin/store endpoints (shopware => Entity)
414
+ > structs -- data structures that do not have a model (shopware => Struct)
415
+ base.py -- All the Base Classes (nearly)
416
+ fieldsets.py -- FieldSetBase has its own file to prevent pydantic problems
603
417
  client.py -- Clients & Registry
604
418
  config.py -- Configs
605
419
  exceptions.py -- Exceptions