imagekitio 5.2.0__tar.gz → 5.3.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.
Files changed (257) hide show
  1. {imagekitio-5.2.0 → imagekitio-5.3.0}/.gitignore +1 -0
  2. imagekitio-5.3.0/.release-please-manifest.json +3 -0
  3. {imagekitio-5.2.0 → imagekitio-5.3.0}/CHANGELOG.md +39 -0
  4. {imagekitio-5.2.0 → imagekitio-5.3.0}/CONTRIBUTING.md +0 -7
  5. {imagekitio-5.2.0 → imagekitio-5.3.0}/PKG-INFO +3 -3
  6. {imagekitio-5.2.0 → imagekitio-5.3.0}/pyproject.toml +4 -4
  7. {imagekitio-5.2.0 → imagekitio-5.3.0}/requirements-dev.lock +11 -11
  8. {imagekitio-5.2.0 → imagekitio-5.3.0}/requirements.lock +5 -5
  9. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_compat.py +9 -2
  10. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_qs.py +4 -1
  11. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_response.py +3 -0
  12. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_streaming.py +8 -3
  13. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/__init__.py +1 -0
  14. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_compat.py +1 -1
  15. imagekitio-5.3.0/src/imagekitio/_utils/_path.py +127 -0
  16. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_version.py +1 -1
  17. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/lib/helper.py +18 -3
  18. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/accounts/origins.py +7 -7
  19. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/accounts/url_endpoints.py +7 -7
  20. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/beta/v2/files.py +10 -8
  21. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/cache/invalidation.py +3 -3
  22. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/custom_metadata_fields.py +5 -5
  23. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/files/files.py +17 -15
  24. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/files/metadata.py +3 -3
  25. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/files/versions.py +9 -8
  26. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/folders/job.py +3 -2
  27. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/saved_extensions.py +7 -7
  28. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/extension_config.py +9 -3
  29. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/extensions.py +9 -3
  30. imagekitio-5.3.0/src/imagekitio/types/shared/overlay_position.py +66 -0
  31. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/extension_config.py +9 -3
  32. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/extensions.py +9 -3
  33. imagekitio-5.3.0/src/imagekitio/types/shared_params/overlay_position.py +65 -0
  34. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/accounts/test_origins.py +166 -166
  35. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/accounts/test_url_endpoints.py +40 -40
  36. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/accounts/test_usage.py +6 -6
  37. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/beta/v2/test_files.py +16 -16
  38. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/cache/test_invalidation.py +14 -14
  39. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/files/test_bulk.py +24 -24
  40. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/files/test_metadata.py +14 -14
  41. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/files/test_versions.py +32 -32
  42. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/folders/test_job.py +8 -8
  43. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_assets.py +8 -8
  44. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_custom_metadata_fields.py +34 -34
  45. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_dummy.py +86 -8
  46. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_files.py +74 -74
  47. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_folders.py +34 -34
  48. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_saved_extensions.py +40 -40
  49. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/test_webhooks.py +34 -10
  50. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/url_generation/test_overlay.py +22 -0
  51. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_client.py +26 -10
  52. imagekitio-5.3.0/tests/test_utils/test_path.py +89 -0
  53. imagekitio-5.2.0/.release-please-manifest.json +0 -3
  54. imagekitio-5.2.0/src/imagekitio/types/shared/overlay_position.py +0 -36
  55. imagekitio-5.2.0/src/imagekitio/types/shared_params/overlay_position.py +0 -34
  56. {imagekitio-5.2.0 → imagekitio-5.3.0}/LICENSE +0 -0
  57. {imagekitio-5.2.0 → imagekitio-5.3.0}/README.md +0 -0
  58. {imagekitio-5.2.0 → imagekitio-5.3.0}/SECURITY.md +0 -0
  59. {imagekitio-5.2.0 → imagekitio-5.3.0}/api.md +0 -0
  60. {imagekitio-5.2.0 → imagekitio-5.3.0}/bin/check-release-environment +0 -0
  61. {imagekitio-5.2.0 → imagekitio-5.3.0}/bin/publish-pypi +0 -0
  62. {imagekitio-5.2.0 → imagekitio-5.3.0}/examples/.keep +0 -0
  63. {imagekitio-5.2.0 → imagekitio-5.3.0}/noxfile.py +0 -0
  64. {imagekitio-5.2.0 → imagekitio-5.3.0}/release-please-config.json +0 -0
  65. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekit/lib/.keep +0 -0
  66. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/__init__.py +0 -0
  67. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_base_client.py +0 -0
  68. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_client.py +1 -1
  69. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_constants.py +0 -0
  70. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_exceptions.py +0 -0
  71. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_files.py +0 -0
  72. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_models.py +0 -0
  73. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_resource.py +0 -0
  74. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_types.py +0 -0
  75. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_datetime_parse.py +0 -0
  76. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_json.py +0 -0
  77. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_logs.py +0 -0
  78. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_proxy.py +0 -0
  79. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_reflection.py +0 -0
  80. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_resources_proxy.py +0 -0
  81. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_streams.py +0 -0
  82. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_sync.py +0 -0
  83. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_transform.py +0 -0
  84. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_typing.py +0 -0
  85. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/_utils/_utils.py +0 -0
  86. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/lib/.keep +0 -0
  87. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/lib/__init__.py +0 -0
  88. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/lib/serialization_utils.py +0 -0
  89. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/py.typed +0 -0
  90. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/__init__.py +0 -0
  91. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/accounts/__init__.py +0 -0
  92. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/accounts/accounts.py +0 -0
  93. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/accounts/usage.py +0 -0
  94. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/assets.py +0 -0
  95. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/beta/__init__.py +0 -0
  96. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/beta/beta.py +0 -0
  97. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/beta/v2/__init__.py +0 -0
  98. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/beta/v2/v2.py +0 -0
  99. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/cache/__init__.py +0 -0
  100. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/cache/cache.py +0 -0
  101. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/dummy.py +0 -0
  102. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/files/__init__.py +0 -0
  103. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/files/bulk.py +0 -0
  104. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/folders/__init__.py +0 -0
  105. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/folders/folders.py +0 -0
  106. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/resources/webhooks.py +0 -0
  107. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/__init__.py +0 -0
  108. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/__init__.py +0 -0
  109. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/origin_create_params.py +0 -0
  110. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/origin_list_response.py +0 -0
  111. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/origin_request_param.py +0 -0
  112. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/origin_response.py +0 -0
  113. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/origin_update_params.py +0 -0
  114. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/url_endpoint_create_params.py +0 -0
  115. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/url_endpoint_list_response.py +0 -0
  116. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/url_endpoint_response.py +0 -0
  117. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/url_endpoint_update_params.py +0 -0
  118. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/usage_get_params.py +0 -0
  119. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/accounts/usage_get_response.py +0 -0
  120. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/asset_list_params.py +0 -0
  121. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/asset_list_response.py +0 -0
  122. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/base_webhook_event.py +0 -0
  123. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/beta/__init__.py +0 -0
  124. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/beta/v2/__init__.py +0 -0
  125. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/beta/v2/file_upload_params.py +0 -0
  126. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/beta/v2/file_upload_response.py +0 -0
  127. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/cache/__init__.py +0 -0
  128. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/cache/invalidation_create_params.py +0 -0
  129. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/cache/invalidation_create_response.py +0 -0
  130. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/cache/invalidation_get_response.py +0 -0
  131. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/custom_metadata_field.py +0 -0
  132. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/custom_metadata_field_create_params.py +0 -0
  133. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/custom_metadata_field_delete_response.py +0 -0
  134. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/custom_metadata_field_list_params.py +0 -0
  135. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/custom_metadata_field_list_response.py +0 -0
  136. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/custom_metadata_field_update_params.py +0 -0
  137. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/dummy_create_params.py +0 -0
  138. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file.py +0 -0
  139. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_copy_params.py +0 -0
  140. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_copy_response.py +0 -0
  141. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_move_params.py +0 -0
  142. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_move_response.py +0 -0
  143. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_rename_params.py +0 -0
  144. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_rename_response.py +0 -0
  145. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_update_params.py +0 -0
  146. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_update_response.py +0 -0
  147. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_upload_params.py +0 -0
  148. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/file_upload_response.py +0 -0
  149. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/__init__.py +0 -0
  150. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_add_tags_params.py +0 -0
  151. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_add_tags_response.py +0 -0
  152. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_delete_params.py +0 -0
  153. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_delete_response.py +0 -0
  154. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_remove_ai_tags_params.py +0 -0
  155. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_remove_ai_tags_response.py +0 -0
  156. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_remove_tags_params.py +0 -0
  157. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/bulk_remove_tags_response.py +0 -0
  158. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/metadata_get_from_url_params.py +0 -0
  159. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/version_delete_response.py +0 -0
  160. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/files/version_list_response.py +0 -0
  161. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder.py +0 -0
  162. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_copy_params.py +0 -0
  163. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_copy_response.py +0 -0
  164. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_create_params.py +0 -0
  165. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_create_response.py +0 -0
  166. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_delete_params.py +0 -0
  167. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_delete_response.py +0 -0
  168. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_move_params.py +0 -0
  169. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_move_response.py +0 -0
  170. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_rename_params.py +0 -0
  171. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folder_rename_response.py +0 -0
  172. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folders/__init__.py +0 -0
  173. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/folders/job_get_response.py +0 -0
  174. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/metadata.py +0 -0
  175. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/saved_extension_create_params.py +0 -0
  176. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/saved_extension_list_response.py +0 -0
  177. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/saved_extension_update_params.py +0 -0
  178. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/__init__.py +0 -0
  179. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/base_overlay.py +0 -0
  180. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/get_image_attributes_options.py +0 -0
  181. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/image_overlay.py +0 -0
  182. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/overlay.py +0 -0
  183. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/overlay_timing.py +0 -0
  184. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/responsive_image_attributes.py +0 -0
  185. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/saved_extension.py +0 -0
  186. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/solid_color_overlay.py +0 -0
  187. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/solid_color_overlay_transformation.py +0 -0
  188. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/src_options.py +0 -0
  189. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/streaming_resolution.py +0 -0
  190. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/subtitle_overlay.py +0 -0
  191. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/subtitle_overlay_transformation.py +0 -0
  192. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/text_overlay.py +0 -0
  193. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/text_overlay_transformation.py +0 -0
  194. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/transformation.py +0 -0
  195. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/transformation_position.py +0 -0
  196. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared/video_overlay.py +0 -0
  197. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/__init__.py +0 -0
  198. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/base_overlay.py +0 -0
  199. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/get_image_attributes_options.py +0 -0
  200. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/image_overlay.py +0 -0
  201. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/overlay.py +0 -0
  202. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/overlay_timing.py +0 -0
  203. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/responsive_image_attributes.py +0 -0
  204. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/saved_extension.py +0 -0
  205. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/solid_color_overlay.py +0 -0
  206. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/solid_color_overlay_transformation.py +0 -0
  207. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/src_options.py +0 -0
  208. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/streaming_resolution.py +0 -0
  209. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/subtitle_overlay.py +0 -0
  210. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/subtitle_overlay_transformation.py +0 -0
  211. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/text_overlay.py +0 -0
  212. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/text_overlay_transformation.py +0 -0
  213. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/transformation.py +0 -0
  214. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/transformation_position.py +0 -0
  215. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/shared_params/video_overlay.py +0 -0
  216. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/unsafe_unwrap_webhook_event.py +0 -0
  217. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/unwrap_webhook_event.py +0 -0
  218. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/update_file_request_param.py +0 -0
  219. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/upload_post_transform_error_event.py +0 -0
  220. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/upload_post_transform_success_event.py +0 -0
  221. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/upload_pre_transform_error_event.py +0 -0
  222. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/upload_pre_transform_success_event.py +0 -0
  223. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/video_transformation_accepted_event.py +0 -0
  224. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/video_transformation_error_event.py +0 -0
  225. {imagekitio-5.2.0 → imagekitio-5.3.0}/src/imagekitio/types/video_transformation_ready_event.py +0 -0
  226. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/__init__.py +0 -0
  227. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/__init__.py +0 -0
  228. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/accounts/__init__.py +0 -0
  229. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/beta/__init__.py +0 -0
  230. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/beta/v2/__init__.py +0 -0
  231. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/cache/__init__.py +0 -0
  232. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/files/__init__.py +0 -0
  233. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/api_resources/folders/__init__.py +0 -0
  234. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/conftest.py +0 -0
  235. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/__init__.py +0 -0
  236. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/test_helper_authentication.py +0 -0
  237. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/test_serialization_utils.py +0 -0
  238. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/url_generation/__init__.py +0 -0
  239. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/url_generation/test_advanced_url_generation.py +0 -0
  240. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/url_generation/test_basic_url_generation.py +0 -0
  241. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/url_generation/test_build_transformation_string.py +0 -0
  242. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/custom/url_generation/test_signing.py +0 -0
  243. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/sample_file.txt +0 -0
  244. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_deepcopy.py +0 -0
  245. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_extract_files.py +0 -0
  246. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_files.py +0 -0
  247. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_models.py +0 -0
  248. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_qs.py +0 -0
  249. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_required_args.py +0 -0
  250. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_response.py +0 -0
  251. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_streaming.py +0 -0
  252. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_transform.py +0 -0
  253. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_utils/test_datetime_parse.py +0 -0
  254. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_utils/test_json.py +0 -0
  255. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_utils/test_proxy.py +0 -0
  256. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/test_utils/test_typing.py +0 -0
  257. {imagekitio-5.2.0 → imagekitio-5.3.0}/tests/utils.py +0 -0
@@ -1,4 +1,5 @@
1
1
  .prism.log
2
+ .stdy.log
2
3
  _dev
3
4
 
4
5
  __pycache__
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "5.3.0"
3
+ }
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.3.0 (2026-04-06)
4
+
5
+ Full Changelog: [v5.2.0...v5.3.0](https://github.com/imagekit-developer/imagekit-python/compare/v5.2.0...v5.3.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** dpr type update ([39d38db](https://github.com/imagekit-developer/imagekit-python/commit/39d38dbd0ca1e81dc84771e6a98a629f90e8dba9))
10
+ * **api:** Introduce lxc, lyc, lap parameters in overlays. ([5c9a08b](https://github.com/imagekit-developer/imagekit-python/commit/5c9a08b40db8734d022ff4670b8cf9204b2841fd))
11
+ * **api:** revert dpr breaking change ([7301276](https://github.com/imagekit-developer/imagekit-python/commit/73012764930ba8b461f98bbfd0349b395e46a7a4))
12
+ * **client:** import HelperResource and AsyncHelperResource in TYPE_CHECKING block ([22fc9cb](https://github.com/imagekit-developer/imagekit-python/commit/22fc9cb33d8c5724b0a042cc014ed6bdd54f7113))
13
+ * **internal:** implement indices array format for query and form serialization ([4533c28](https://github.com/imagekit-developer/imagekit-python/commit/4533c2831ad26cf5ef53da37c8d4fe095bb67bd8))
14
+ * **overlay:** support camelCase and snake_case for position properties in overlays ([5dd43b9](https://github.com/imagekit-developer/imagekit-python/commit/5dd43b9d84722fa62ffff4b8985282489003aa13))
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * **deps:** bump minimum typing-extensions version ([393174d](https://github.com/imagekit-developer/imagekit-python/commit/393174d253a106393b888aed50f9ca7623c9c06e))
20
+ * **pydantic:** do not pass `by_alias` unless set ([fda01e4](https://github.com/imagekit-developer/imagekit-python/commit/fda01e45e315c192d24a6183cd24fd43cbcb0722))
21
+ * sanitize endpoint path params ([fa1972c](https://github.com/imagekit-developer/imagekit-python/commit/fa1972cd605c2a7a81ad069161cc687d0ec4193d))
22
+
23
+
24
+ ### Chores
25
+
26
+ * **ci:** skip lint on metadata-only changes ([5e9e6f3](https://github.com/imagekit-developer/imagekit-python/commit/5e9e6f35ba227e2fda57cb343f26f0ad0bcbb584))
27
+ * **ci:** skip uploading artifacts on stainless-internal branches ([15805f5](https://github.com/imagekit-developer/imagekit-python/commit/15805f5e6b642f0cebfbc8131f99f886e8e72e99))
28
+ * **dependencies:** require standardwebhooks 1.0.1 ([f7c4465](https://github.com/imagekit-developer/imagekit-python/commit/f7c44652ef95cfa1aefef380d280036158519007))
29
+ * format all `api.md` files ([09cbb17](https://github.com/imagekit-developer/imagekit-python/commit/09cbb17e722d374477b13fd4045201ab75ddcc7e))
30
+ * **internal:** add request options to SSE classes ([c0dee43](https://github.com/imagekit-developer/imagekit-python/commit/c0dee43afe3bc1f6ea35649532594e59fb4b8953))
31
+ * **internal:** bump dependencies ([6702b4b](https://github.com/imagekit-developer/imagekit-python/commit/6702b4bcd12af1d670a4b73a7d9bedd68ccc5560))
32
+ * **internal:** fix lint error on Python 3.14 ([89d503b](https://github.com/imagekit-developer/imagekit-python/commit/89d503b2a885f57edbbd6ffded3d1cddac61a53e))
33
+ * **internal:** make `test_proxy_environment_variables` more resilient ([821dd3f](https://github.com/imagekit-developer/imagekit-python/commit/821dd3f61db9b2be3297dc1b8a9e63d257df9ed1))
34
+ * **internal:** make `test_proxy_environment_variables` more resilient to env ([487887e](https://github.com/imagekit-developer/imagekit-python/commit/487887eb0e4c405c0f8294e6a82ef6c7a2187c5c))
35
+ * **internal:** remove mock server code ([978ed61](https://github.com/imagekit-developer/imagekit-python/commit/978ed611a909e2d616b322e23bfe3d14e8f256f4))
36
+ * **internal:** tweak CI branches ([369ff73](https://github.com/imagekit-developer/imagekit-python/commit/369ff736880f83ac7196411241801fe9b04a7dfb))
37
+ * **internal:** update gitignore ([ab04623](https://github.com/imagekit-developer/imagekit-python/commit/ab04623fdceb9337d9519b119ead7949f1d4ed2f))
38
+ * **tests:** update webhook tests ([d94ada8](https://github.com/imagekit-developer/imagekit-python/commit/d94ada85d3c70d8f896fe276d73afd6c3fb17326))
39
+ * update mock server docs ([54f47c6](https://github.com/imagekit-developer/imagekit-python/commit/54f47c663b48f2b6a88bf05ba26a0f2a139ee752))
40
+ * update placeholder string ([d06cdca](https://github.com/imagekit-developer/imagekit-python/commit/d06cdca52df17c23df1d9cd8a468b8184bde219a))
41
+
3
42
  ## 5.2.0 (2026-02-02)
4
43
 
5
44
  Full Changelog: [v5.1.2...v5.2.0](https://github.com/imagekit-developer/imagekit-python/compare/v5.1.2...v5.2.0)
@@ -85,13 +85,6 @@ $ pip install ./path-to-wheel-file.whl
85
85
 
86
86
  ## Running tests
87
87
 
88
- Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests.
89
-
90
- ```sh
91
- # you will need npm installed
92
- $ npx prism mock path/to/your/openapi.yml
93
- ```
94
-
95
88
  ```sh
96
89
  $ ./scripts/test
97
90
  ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: imagekitio
3
- Version: 5.2.0
3
+ Version: 5.3.0
4
4
  Summary: The official Python library for the ImageKit API
5
5
  Project-URL: Homepage, https://github.com/imagekit-developer/imagekit-python
6
6
  Project-URL: Repository, https://github.com/imagekit-developer/imagekit-python
@@ -27,12 +27,12 @@ Requires-Dist: distro<2,>=1.7.0
27
27
  Requires-Dist: httpx<1,>=0.23.0
28
28
  Requires-Dist: pydantic<3,>=1.9.0
29
29
  Requires-Dist: sniffio
30
- Requires-Dist: typing-extensions<5,>=4.10
30
+ Requires-Dist: typing-extensions<5,>=4.14
31
31
  Provides-Extra: aiohttp
32
32
  Requires-Dist: aiohttp; extra == 'aiohttp'
33
33
  Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
34
34
  Provides-Extra: webhooks
35
- Requires-Dist: standardwebhooks; extra == 'webhooks'
35
+ Requires-Dist: standardwebhooks<2,>=1.0.1; extra == 'webhooks'
36
36
  Description-Content-Type: text/markdown
37
37
 
38
38
  # ImageKit.io Python SDK
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "imagekitio"
3
- version = "5.2.0"
3
+ version = "5.3.0"
4
4
  description = "The official Python library for the ImageKit API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -11,7 +11,7 @@ authors = [
11
11
  dependencies = [
12
12
  "httpx>=0.23.0, <1",
13
13
  "pydantic>=1.9.0, <3",
14
- "typing-extensions>=4.10, <5",
14
+ "typing-extensions>=4.14, <5",
15
15
  "anyio>=3.5.0, <5",
16
16
  "distro>=1.7.0, <2",
17
17
  "sniffio",
@@ -42,7 +42,7 @@ Repository = "https://github.com/imagekit-developer/imagekit-python"
42
42
 
43
43
  [project.optional-dependencies]
44
44
  aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
45
- webhooks = ["standardwebhooks"]
45
+ webhooks = ["standardwebhooks >= 1.0.1, < 2"]
46
46
 
47
47
  [tool.rye]
48
48
  managed = true
@@ -70,7 +70,7 @@ format = { chain = [
70
70
  # run formatting again to fix any inconsistencies when imports are stripped
71
71
  "format:ruff",
72
72
  ]}
73
- "format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md"
73
+ "format:docs" = "bash -c 'python scripts/utils/ruffen-docs.py README.md $(find . -type f -name api.md)'"
74
74
  "format:ruff" = "ruff format"
75
75
 
76
76
  "lint" = { chain = [
@@ -12,14 +12,14 @@
12
12
  -e file:.
13
13
  aiohappyeyeballs==2.6.1
14
14
  # via aiohttp
15
- aiohttp==3.13.2
15
+ aiohttp==3.13.3
16
16
  # via httpx-aiohttp
17
17
  # via imagekitio
18
18
  aiosignal==1.4.0
19
19
  # via aiohttp
20
20
  annotated-types==0.7.0
21
21
  # via pydantic
22
- anyio==4.12.0
22
+ anyio==4.12.1
23
23
  # via httpx
24
24
  # via imagekitio
25
25
  argcomplete==3.6.3
@@ -32,7 +32,7 @@ attrs==25.4.0
32
32
  # via standardwebhooks
33
33
  backports-asyncio-runner==1.2.0
34
34
  # via pytest-asyncio
35
- certifi==2025.11.12
35
+ certifi==2026.1.4
36
36
  # via httpcore
37
37
  # via httpx
38
38
  colorlog==6.10.1
@@ -65,7 +65,7 @@ httpx==0.28.1
65
65
  # via imagekitio
66
66
  # via respx
67
67
  # via standardwebhooks
68
- httpx-aiohttp==0.1.9
68
+ httpx-aiohttp==0.1.12
69
69
  # via imagekitio
70
70
  humanize==4.13.0
71
71
  # via nox
@@ -73,7 +73,7 @@ idna==3.11
73
73
  # via anyio
74
74
  # via httpx
75
75
  # via yarl
76
- importlib-metadata==8.7.0
76
+ importlib-metadata==8.7.1
77
77
  iniconfig==2.1.0
78
78
  # via pytest
79
79
  markdown-it-py==3.0.0
@@ -86,14 +86,14 @@ multidict==6.7.0
86
86
  mypy==1.17.0
87
87
  mypy-extensions==1.1.0
88
88
  # via mypy
89
- nodeenv==1.9.1
89
+ nodeenv==1.10.0
90
90
  # via pyright
91
91
  nox==2025.11.12
92
92
  packaging==25.0
93
93
  # via dependency-groups
94
94
  # via nox
95
95
  # via pytest
96
- pathspec==0.12.1
96
+ pathspec==1.0.3
97
97
  # via mypy
98
98
  platformdirs==4.4.0
99
99
  # via virtualenv
@@ -120,15 +120,15 @@ python-dateutil==2.9.0.post0
120
120
  # via time-machine
121
121
  respx==0.22.0
122
122
  rich==14.2.0
123
- ruff==0.14.7
123
+ ruff==0.14.13
124
124
  six==1.17.0
125
125
  # via python-dateutil
126
126
  sniffio==1.3.1
127
127
  # via imagekitio
128
- standardwebhooks==1.0.0
128
+ standardwebhooks==1.0.1
129
129
  # via imagekitio
130
130
  time-machine==2.19.0
131
- tomli==2.3.0
131
+ tomli==2.4.0
132
132
  # via dependency-groups
133
133
  # via mypy
134
134
  # via nox
@@ -152,7 +152,7 @@ typing-extensions==4.15.0
152
152
  # via virtualenv
153
153
  typing-inspection==0.4.2
154
154
  # via pydantic
155
- virtualenv==20.35.4
155
+ virtualenv==20.36.1
156
156
  # via nox
157
157
  wrapt==2.0.1
158
158
  # via deprecated
@@ -12,14 +12,14 @@
12
12
  -e file:.
13
13
  aiohappyeyeballs==2.6.1
14
14
  # via aiohttp
15
- aiohttp==3.13.2
15
+ aiohttp==3.13.3
16
16
  # via httpx-aiohttp
17
17
  # via imagekitio
18
18
  aiosignal==1.4.0
19
19
  # via aiohttp
20
20
  annotated-types==0.7.0
21
21
  # via pydantic
22
- anyio==4.12.0
22
+ anyio==4.12.1
23
23
  # via httpx
24
24
  # via imagekitio
25
25
  async-timeout==5.0.1
@@ -27,7 +27,7 @@ async-timeout==5.0.1
27
27
  attrs==25.4.0
28
28
  # via aiohttp
29
29
  # via standardwebhooks
30
- certifi==2025.11.12
30
+ certifi==2026.1.4
31
31
  # via httpcore
32
32
  # via httpx
33
33
  deprecated==1.3.1
@@ -47,7 +47,7 @@ httpx==0.28.1
47
47
  # via httpx-aiohttp
48
48
  # via imagekitio
49
49
  # via standardwebhooks
50
- httpx-aiohttp==0.1.9
50
+ httpx-aiohttp==0.1.12
51
51
  # via imagekitio
52
52
  idna==3.11
53
53
  # via anyio
@@ -69,7 +69,7 @@ six==1.17.0
69
69
  # via python-dateutil
70
70
  sniffio==1.3.1
71
71
  # via imagekitio
72
- standardwebhooks==1.0.0
72
+ standardwebhooks==1.0.1
73
73
  # via imagekitio
74
74
  types-deprecated==1.3.1.20251101
75
75
  # via standardwebhooks
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any, Union, Generic, TypeVar, Callable, cast, overload
4
4
  from datetime import date, datetime
5
- from typing_extensions import Self, Literal
5
+ from typing_extensions import Self, Literal, TypedDict
6
6
 
7
7
  import pydantic
8
8
  from pydantic.fields import FieldInfo
@@ -131,6 +131,10 @@ def model_json(model: pydantic.BaseModel, *, indent: int | None = None) -> str:
131
131
  return model.model_dump_json(indent=indent)
132
132
 
133
133
 
134
+ class _ModelDumpKwargs(TypedDict, total=False):
135
+ by_alias: bool
136
+
137
+
134
138
  def model_dump(
135
139
  model: pydantic.BaseModel,
136
140
  *,
@@ -142,6 +146,9 @@ def model_dump(
142
146
  by_alias: bool | None = None,
143
147
  ) -> dict[str, Any]:
144
148
  if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
149
+ kwargs: _ModelDumpKwargs = {}
150
+ if by_alias is not None:
151
+ kwargs["by_alias"] = by_alias
145
152
  return model.model_dump(
146
153
  mode=mode,
147
154
  exclude=exclude,
@@ -149,7 +156,7 @@ def model_dump(
149
156
  exclude_defaults=exclude_defaults,
150
157
  # warnings are not supported in Pydantic v1
151
158
  warnings=True if PYDANTIC_V1 else warnings,
152
- by_alias=by_alias,
159
+ **kwargs,
153
160
  )
154
161
  return cast(
155
162
  "dict[str, Any]",
@@ -101,7 +101,10 @@ class Querystring:
101
101
  items.extend(self._stringify_item(key, item, opts))
102
102
  return items
103
103
  elif array_format == "indices":
104
- raise NotImplementedError("The array indices format is not supported yet")
104
+ items = []
105
+ for i, item in enumerate(value):
106
+ items.extend(self._stringify_item(f"{key}[{i}]", item, opts))
107
+ return items
105
108
  elif array_format == "brackets":
106
109
  items = []
107
110
  key = key + "[]"
@@ -152,6 +152,7 @@ class BaseAPIResponse(Generic[R]):
152
152
  ),
153
153
  response=self.http_response,
154
154
  client=cast(Any, self._client),
155
+ options=self._options,
155
156
  ),
156
157
  )
157
158
 
@@ -162,6 +163,7 @@ class BaseAPIResponse(Generic[R]):
162
163
  cast_to=extract_stream_chunk_type(self._stream_cls),
163
164
  response=self.http_response,
164
165
  client=cast(Any, self._client),
166
+ options=self._options,
165
167
  ),
166
168
  )
167
169
 
@@ -175,6 +177,7 @@ class BaseAPIResponse(Generic[R]):
175
177
  cast_to=cast_to,
176
178
  response=self.http_response,
177
179
  client=cast(Any, self._client),
180
+ options=self._options,
178
181
  ),
179
182
  )
180
183
 
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
  import json
5
5
  import inspect
6
6
  from types import TracebackType
7
- from typing import TYPE_CHECKING, Any, Generic, TypeVar, Iterator, AsyncIterator, cast
7
+ from typing import TYPE_CHECKING, Any, Generic, TypeVar, Iterator, Optional, AsyncIterator, cast
8
8
  from typing_extensions import Self, Protocol, TypeGuard, override, get_origin, runtime_checkable
9
9
 
10
10
  import httpx
@@ -13,6 +13,7 @@ from ._utils import extract_type_var_from_base
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from ._client import ImageKit, AsyncImageKit
16
+ from ._models import FinalRequestOptions
16
17
 
17
18
 
18
19
  _T = TypeVar("_T")
@@ -22,7 +23,7 @@ class Stream(Generic[_T]):
22
23
  """Provides the core interface to iterate over a synchronous stream response."""
23
24
 
24
25
  response: httpx.Response
25
-
26
+ _options: Optional[FinalRequestOptions] = None
26
27
  _decoder: SSEBytesDecoder
27
28
 
28
29
  def __init__(
@@ -31,10 +32,12 @@ class Stream(Generic[_T]):
31
32
  cast_to: type[_T],
32
33
  response: httpx.Response,
33
34
  client: ImageKit,
35
+ options: Optional[FinalRequestOptions] = None,
34
36
  ) -> None:
35
37
  self.response = response
36
38
  self._cast_to = cast_to
37
39
  self._client = client
40
+ self._options = options
38
41
  self._decoder = client._make_sse_decoder()
39
42
  self._iterator = self.__stream__()
40
43
 
@@ -85,7 +88,7 @@ class AsyncStream(Generic[_T]):
85
88
  """Provides the core interface to iterate over an asynchronous stream response."""
86
89
 
87
90
  response: httpx.Response
88
-
91
+ _options: Optional[FinalRequestOptions] = None
89
92
  _decoder: SSEDecoder | SSEBytesDecoder
90
93
 
91
94
  def __init__(
@@ -94,10 +97,12 @@ class AsyncStream(Generic[_T]):
94
97
  cast_to: type[_T],
95
98
  response: httpx.Response,
96
99
  client: AsyncImageKit,
100
+ options: Optional[FinalRequestOptions] = None,
97
101
  ) -> None:
98
102
  self.response = response
99
103
  self._cast_to = cast_to
100
104
  self._client = client
105
+ self._options = options
101
106
  self._decoder = client._make_sse_decoder()
102
107
  self._iterator = self.__stream__()
103
108
 
@@ -1,3 +1,4 @@
1
+ from ._path import path_template as path_template
1
2
  from ._sync import asyncify as asyncify
2
3
  from ._proxy import LazyProxy as LazyProxy
3
4
  from ._utils import (
@@ -26,7 +26,7 @@ def is_union(tp: Optional[Type[Any]]) -> bool:
26
26
  else:
27
27
  import types
28
28
 
29
- return tp is Union or tp is types.UnionType
29
+ return tp is Union or tp is types.UnionType # type: ignore[comparison-overlap]
30
30
 
31
31
 
32
32
  def is_typeddict(tp: Type[Any]) -> bool:
@@ -0,0 +1,127 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from typing import (
5
+ Any,
6
+ Mapping,
7
+ Callable,
8
+ )
9
+ from urllib.parse import quote
10
+
11
+ # Matches '.' or '..' where each dot is either literal or percent-encoded (%2e / %2E).
12
+ _DOT_SEGMENT_RE = re.compile(r"^(?:\.|%2[eE]){1,2}$")
13
+
14
+ _PLACEHOLDER_RE = re.compile(r"\{(\w+)\}")
15
+
16
+
17
+ def _quote_path_segment_part(value: str) -> str:
18
+ """Percent-encode `value` for use in a URI path segment.
19
+
20
+ Considers characters not in `pchar` set from RFC 3986 §3.3 to be unsafe.
21
+ https://datatracker.ietf.org/doc/html/rfc3986#section-3.3
22
+ """
23
+ # quote() already treats unreserved characters (letters, digits, and -._~)
24
+ # as safe, so we only need to add sub-delims, ':', and '@'.
25
+ # Notably, unlike the default `safe` for quote(), / is unsafe and must be quoted.
26
+ return quote(value, safe="!$&'()*+,;=:@")
27
+
28
+
29
+ def _quote_query_part(value: str) -> str:
30
+ """Percent-encode `value` for use in a URI query string.
31
+
32
+ Considers &, = and characters not in `query` set from RFC 3986 §3.4 to be unsafe.
33
+ https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
34
+ """
35
+ return quote(value, safe="!$'()*+,;:@/?")
36
+
37
+
38
+ def _quote_fragment_part(value: str) -> str:
39
+ """Percent-encode `value` for use in a URI fragment.
40
+
41
+ Considers characters not in `fragment` set from RFC 3986 §3.5 to be unsafe.
42
+ https://datatracker.ietf.org/doc/html/rfc3986#section-3.5
43
+ """
44
+ return quote(value, safe="!$&'()*+,;=:@/?")
45
+
46
+
47
+ def _interpolate(
48
+ template: str,
49
+ values: Mapping[str, Any],
50
+ quoter: Callable[[str], str],
51
+ ) -> str:
52
+ """Replace {name} placeholders in `template`, quoting each value with `quoter`.
53
+
54
+ Placeholder names are looked up in `values`.
55
+
56
+ Raises:
57
+ KeyError: If a placeholder is not found in `values`.
58
+ """
59
+ # re.split with a capturing group returns alternating
60
+ # [text, name, text, name, ..., text] elements.
61
+ parts = _PLACEHOLDER_RE.split(template)
62
+
63
+ for i in range(1, len(parts), 2):
64
+ name = parts[i]
65
+ if name not in values:
66
+ raise KeyError(f"a value for placeholder {{{name}}} was not provided")
67
+ val = values[name]
68
+ if val is None:
69
+ parts[i] = "null"
70
+ elif isinstance(val, bool):
71
+ parts[i] = "true" if val else "false"
72
+ else:
73
+ parts[i] = quoter(str(values[name]))
74
+
75
+ return "".join(parts)
76
+
77
+
78
+ def path_template(template: str, /, **kwargs: Any) -> str:
79
+ """Interpolate {name} placeholders in `template` from keyword arguments.
80
+
81
+ Args:
82
+ template: The template string containing {name} placeholders.
83
+ **kwargs: Keyword arguments to interpolate into the template.
84
+
85
+ Returns:
86
+ The template with placeholders interpolated and percent-encoded.
87
+
88
+ Safe characters for percent-encoding are dependent on the URI component.
89
+ Placeholders in path and fragment portions are percent-encoded where the `segment`
90
+ and `fragment` sets from RFC 3986 respectively are considered safe.
91
+ Placeholders in the query portion are percent-encoded where the `query` set from
92
+ RFC 3986 §3.3 is considered safe except for = and & characters.
93
+
94
+ Raises:
95
+ KeyError: If a placeholder is not found in `kwargs`.
96
+ ValueError: If resulting path contains /./ or /../ segments (including percent-encoded dot-segments).
97
+ """
98
+ # Split the template into path, query, and fragment portions.
99
+ fragment_template: str | None = None
100
+ query_template: str | None = None
101
+
102
+ rest = template
103
+ if "#" in rest:
104
+ rest, fragment_template = rest.split("#", 1)
105
+ if "?" in rest:
106
+ rest, query_template = rest.split("?", 1)
107
+ path_template = rest
108
+
109
+ # Interpolate each portion with the appropriate quoting rules.
110
+ path_result = _interpolate(path_template, kwargs, _quote_path_segment_part)
111
+
112
+ # Reject dot-segments (. and ..) in the final assembled path. The check
113
+ # runs after interpolation so that adjacent placeholders or a mix of static
114
+ # text and placeholders that together form a dot-segment are caught.
115
+ # Also reject percent-encoded dot-segments to protect against incorrectly
116
+ # implemented normalization in servers/proxies.
117
+ for segment in path_result.split("/"):
118
+ if _DOT_SEGMENT_RE.match(segment):
119
+ raise ValueError(f"Constructed path {path_result!r} contains dot-segment {segment!r} which is not allowed")
120
+
121
+ result = path_result
122
+ if query_template is not None:
123
+ result += "?" + _interpolate(query_template, kwargs, _quote_query_part)
124
+ if fragment_template is not None:
125
+ result += "#" + _interpolate(fragment_template, kwargs, _quote_fragment_part)
126
+
127
+ return result
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "imagekitio"
4
- __version__ = "5.2.0" # x-release-please-version
4
+ __version__ = "5.3.0" # x-release-please-version
@@ -317,12 +317,12 @@ def _process_overlay(overlay: Overlay) -> str:
317
317
 
318
318
  parsed_overlay.append(f"bg-{color}")
319
319
 
320
- # Handle layer_mode property
321
- layer_mode = overlay.get("layer_mode")
320
+ # Handle layerMode and layer_mode (both camelCase and snake_case)
321
+ layer_mode = overlay.get("layerMode") or overlay.get("layer_mode")
322
322
  if layer_mode:
323
323
  parsed_overlay.append(f"lm-{layer_mode}")
324
324
 
325
- # Handle position properties (x, y, focus)
325
+ # Handle position properties (x, y, focus, x_center, y_center, anchor_point)
326
326
  # Node.js uses if (x) which skips falsy values like 0, '', false, null, undefined
327
327
  x = position.get("x")
328
328
  if x:
@@ -332,6 +332,21 @@ def _process_overlay(overlay: Overlay) -> str:
332
332
  if y:
333
333
  parsed_overlay.append(f"ly-{y}")
334
334
 
335
+ # Handle xCenter and x_center (both snake_case and camelCase)
336
+ x_center = position.get("xCenter") or position.get("x_center")
337
+ if x_center:
338
+ parsed_overlay.append(f"lxc-{x_center}")
339
+
340
+ # Handle yCenter and y_center (both snake_case and camelCase)
341
+ y_center = position.get("yCenter") or position.get("y_center")
342
+ if y_center:
343
+ parsed_overlay.append(f"lyc-{y_center}")
344
+
345
+ # Handle anchorPoint and anchor_point (both snake_case and camelCase)
346
+ anchor_point = position.get("anchorPoint") or position.get("anchor_point")
347
+ if anchor_point:
348
+ parsed_overlay.append(f"lap-{anchor_point}")
349
+
335
350
  focus = position.get("focus")
336
351
  if focus:
337
352
  parsed_overlay.append(f"lfo-{focus}")
@@ -8,7 +8,7 @@ from typing_extensions import Literal, overload
8
8
  import httpx
9
9
 
10
10
  from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
11
- from ..._utils import required_args, maybe_transform, async_maybe_transform
11
+ from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform
12
12
  from ..._compat import cached_property
13
13
  from ..._resource import SyncAPIResource, AsyncAPIResource
14
14
  from ..._response import (
@@ -948,7 +948,7 @@ class OriginsResource(SyncAPIResource):
948
948
  return cast(
949
949
  OriginResponse,
950
950
  self._put(
951
- f"/v1/accounts/origins/{id}",
951
+ path_template("/v1/accounts/origins/{id}", id=id),
952
952
  body=maybe_transform(
953
953
  {
954
954
  "access_key": access_key,
@@ -1038,7 +1038,7 @@ class OriginsResource(SyncAPIResource):
1038
1038
  raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
1039
1039
  extra_headers = {"Accept": "*/*", **(extra_headers or {})}
1040
1040
  return self._delete(
1041
- f"/v1/accounts/origins/{id}",
1041
+ path_template("/v1/accounts/origins/{id}", id=id),
1042
1042
  options=make_request_options(
1043
1043
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
1044
1044
  ),
@@ -1078,7 +1078,7 @@ class OriginsResource(SyncAPIResource):
1078
1078
  return cast(
1079
1079
  OriginResponse,
1080
1080
  self._get(
1081
- f"/v1/accounts/origins/{id}",
1081
+ path_template("/v1/accounts/origins/{id}", id=id),
1082
1082
  options=make_request_options(
1083
1083
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
1084
1084
  ),
@@ -2010,7 +2010,7 @@ class AsyncOriginsResource(AsyncAPIResource):
2010
2010
  return cast(
2011
2011
  OriginResponse,
2012
2012
  await self._put(
2013
- f"/v1/accounts/origins/{id}",
2013
+ path_template("/v1/accounts/origins/{id}", id=id),
2014
2014
  body=await async_maybe_transform(
2015
2015
  {
2016
2016
  "access_key": access_key,
@@ -2100,7 +2100,7 @@ class AsyncOriginsResource(AsyncAPIResource):
2100
2100
  raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
2101
2101
  extra_headers = {"Accept": "*/*", **(extra_headers or {})}
2102
2102
  return await self._delete(
2103
- f"/v1/accounts/origins/{id}",
2103
+ path_template("/v1/accounts/origins/{id}", id=id),
2104
2104
  options=make_request_options(
2105
2105
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
2106
2106
  ),
@@ -2140,7 +2140,7 @@ class AsyncOriginsResource(AsyncAPIResource):
2140
2140
  return cast(
2141
2141
  OriginResponse,
2142
2142
  await self._get(
2143
- f"/v1/accounts/origins/{id}",
2143
+ path_template("/v1/accounts/origins/{id}", id=id),
2144
2144
  options=make_request_options(
2145
2145
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
2146
2146
  ),