casedev 0.2.0__tar.gz → 0.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 (213) hide show
  1. casedev-0.3.0/.release-please-manifest.json +3 -0
  2. {casedev-0.2.0 → casedev-0.3.0}/CHANGELOG.md +13 -0
  3. {casedev-0.2.0 → casedev-0.3.0}/PKG-INFO +1 -1
  4. {casedev-0.2.0 → casedev-0.3.0}/pyproject.toml +1 -1
  5. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_base_client.py +5 -2
  6. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_compat.py +3 -3
  7. casedev-0.3.0/src/casedev/_utils/_json.py +35 -0
  8. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_version.py +1 -1
  9. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/ocr/v1.py +2 -2
  10. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/vault/objects.py +10 -0
  11. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/vault/vault.py +6 -4
  12. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/streaming.py +2 -2
  13. casedev-0.3.0/src/casedev/types/ocr/v1_process_params.py +54 -0
  14. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/ocr/v1_retrieve_response.py +7 -7
  15. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/object_create_presigned_url_params.py +6 -0
  16. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/object_get_text_response.py +10 -10
  17. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/object_list_response.py +13 -13
  18. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/object_retrieve_response.py +13 -13
  19. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_retrieve_response.py +13 -13
  20. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_search_response.py +14 -0
  21. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_upload_params.py +5 -2
  22. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/ocr/test_v1.py +6 -8
  23. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/test_vault.py +2 -2
  24. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/vault/test_objects.py +2 -0
  25. casedev-0.3.0/tests/test_utils/test_json.py +126 -0
  26. casedev-0.2.0/.release-please-manifest.json +0 -3
  27. casedev-0.2.0/src/casedev/types/ocr/v1_process_params.py +0 -46
  28. {casedev-0.2.0 → casedev-0.3.0}/.gitignore +0 -0
  29. {casedev-0.2.0 → casedev-0.3.0}/CONTRIBUTING.md +0 -0
  30. {casedev-0.2.0 → casedev-0.3.0}/LICENSE +0 -0
  31. {casedev-0.2.0 → casedev-0.3.0}/README.md +0 -0
  32. {casedev-0.2.0 → casedev-0.3.0}/SECURITY.md +0 -0
  33. {casedev-0.2.0 → casedev-0.3.0}/api.md +0 -0
  34. {casedev-0.2.0 → casedev-0.3.0}/bin/check-release-environment +0 -0
  35. {casedev-0.2.0 → casedev-0.3.0}/bin/publish-pypi +0 -0
  36. {casedev-0.2.0 → casedev-0.3.0}/examples/.keep +0 -0
  37. {casedev-0.2.0 → casedev-0.3.0}/release-please-config.json +0 -0
  38. {casedev-0.2.0 → casedev-0.3.0}/requirements-dev.lock +0 -0
  39. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/__init__.py +0 -0
  40. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_client.py +0 -0
  41. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_constants.py +0 -0
  42. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_exceptions.py +0 -0
  43. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_files.py +0 -0
  44. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_models.py +0 -0
  45. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_qs.py +0 -0
  46. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_resource.py +0 -0
  47. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_response.py +0 -0
  48. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_streaming.py +0 -0
  49. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_types.py +0 -0
  50. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/__init__.py +0 -0
  51. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_compat.py +0 -0
  52. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_datetime_parse.py +0 -0
  53. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_logs.py +0 -0
  54. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_proxy.py +0 -0
  55. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_reflection.py +0 -0
  56. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_resources_proxy.py +0 -0
  57. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_streams.py +0 -0
  58. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_sync.py +0 -0
  59. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_transform.py +0 -0
  60. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_typing.py +0 -0
  61. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/_utils/_utils.py +0 -0
  62. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/lib/.keep +0 -0
  63. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/py.typed +0 -0
  64. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/__init__.py +0 -0
  65. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/compute/__init__.py +0 -0
  66. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/compute/compute.py +0 -0
  67. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/compute/v1/__init__.py +0 -0
  68. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/compute/v1/environments.py +0 -0
  69. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/compute/v1/secrets.py +0 -0
  70. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/compute/v1/v1.py +0 -0
  71. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/format/__init__.py +0 -0
  72. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/format/format.py +0 -0
  73. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/format/v1/__init__.py +0 -0
  74. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/format/v1/templates.py +0 -0
  75. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/format/v1/v1.py +0 -0
  76. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/llm/__init__.py +0 -0
  77. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/llm/llm.py +0 -0
  78. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/llm/v1/__init__.py +0 -0
  79. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/llm/v1/chat.py +0 -0
  80. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/llm/v1/v1.py +0 -0
  81. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/ocr/__init__.py +0 -0
  82. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/ocr/ocr.py +0 -0
  83. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/search/__init__.py +0 -0
  84. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/search/search.py +0 -0
  85. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/search/v1.py +0 -0
  86. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/vault/__init__.py +0 -0
  87. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/vault/graphrag.py +0 -0
  88. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/__init__.py +0 -0
  89. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/transcription.py +0 -0
  90. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/v1/__init__.py +0 -0
  91. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/v1/speak.py +0 -0
  92. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/v1/v1.py +0 -0
  93. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/resources/voice/voice.py +0 -0
  94. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/__init__.py +0 -0
  95. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/__init__.py +0 -0
  96. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/__init__.py +0 -0
  97. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/environment_create_params.py +0 -0
  98. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/environment_create_response.py +0 -0
  99. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/environment_delete_response.py +0 -0
  100. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/environment_list_response.py +0 -0
  101. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/environment_retrieve_response.py +0 -0
  102. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/environment_set_default_response.py +0 -0
  103. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_create_params.py +0 -0
  104. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_create_response.py +0 -0
  105. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_delete_group_params.py +0 -0
  106. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_delete_group_response.py +0 -0
  107. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_list_params.py +0 -0
  108. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_list_response.py +0 -0
  109. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_retrieve_group_params.py +0 -0
  110. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_retrieve_group_response.py +0 -0
  111. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_update_group_params.py +0 -0
  112. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1/secret_update_group_response.py +0 -0
  113. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1_get_usage_params.py +0 -0
  114. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/compute/v1_get_usage_response.py +0 -0
  115. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/__init__.py +0 -0
  116. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1/__init__.py +0 -0
  117. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1/template_create_params.py +0 -0
  118. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1/template_create_response.py +0 -0
  119. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1/template_list_params.py +0 -0
  120. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1/template_list_response.py +0 -0
  121. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1/template_retrieve_response.py +0 -0
  122. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/format/v1_create_document_params.py +0 -0
  123. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/__init__.py +0 -0
  124. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/v1/__init__.py +0 -0
  125. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/v1/chat_create_completion_params.py +0 -0
  126. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/v1/chat_create_completion_response.py +0 -0
  127. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/v1_create_embedding_params.py +0 -0
  128. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/v1_create_embedding_response.py +0 -0
  129. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm/v1_list_models_response.py +0 -0
  130. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/llm_get_config_response.py +0 -0
  131. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/ocr/__init__.py +0 -0
  132. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/ocr/v1_download_response.py +0 -0
  133. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/ocr/v1_process_response.py +0 -0
  134. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/__init__.py +0 -0
  135. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_answer_params.py +0 -0
  136. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_answer_response.py +0 -0
  137. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_contents_params.py +0 -0
  138. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_contents_response.py +0 -0
  139. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_research_params.py +0 -0
  140. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_research_response.py +0 -0
  141. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_retrieve_research_params.py +0 -0
  142. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_retrieve_research_response.py +0 -0
  143. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_search_params.py +0 -0
  144. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_search_response.py +0 -0
  145. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_similar_params.py +0 -0
  146. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/search/v1_similar_response.py +0 -0
  147. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/__init__.py +0 -0
  148. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/graphrag_get_stats_response.py +0 -0
  149. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/graphrag_init_response.py +0 -0
  150. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/object_create_presigned_url_response.py +0 -0
  151. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault/object_download_response.py +0 -0
  152. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_create_params.py +0 -0
  153. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_create_response.py +0 -0
  154. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_ingest_response.py +0 -0
  155. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_list_response.py +0 -0
  156. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_search_params.py +0 -0
  157. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/vault_upload_response.py +0 -0
  158. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/__init__.py +0 -0
  159. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/streaming_get_url_response.py +0 -0
  160. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/transcription_create_params.py +0 -0
  161. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/transcription_create_response.py +0 -0
  162. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/transcription_retrieve_response.py +0 -0
  163. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/v1/__init__.py +0 -0
  164. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/v1/speak_create_params.py +0 -0
  165. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/v1_list_voices_params.py +0 -0
  166. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/voice/v1_list_voices_response.py +0 -0
  167. {casedev-0.2.0 → casedev-0.3.0}/src/casedev/types/webhooks/__init__.py +0 -0
  168. {casedev-0.2.0 → casedev-0.3.0}/src/casedotdev_sdk_py/lib/.keep +0 -0
  169. {casedev-0.2.0 → casedev-0.3.0}/src/router/lib/.keep +0 -0
  170. {casedev-0.2.0 → casedev-0.3.0}/tests/__init__.py +0 -0
  171. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/__init__.py +0 -0
  172. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/compute/__init__.py +0 -0
  173. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/compute/test_v1.py +0 -0
  174. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/compute/v1/__init__.py +0 -0
  175. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/compute/v1/test_environments.py +0 -0
  176. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/compute/v1/test_secrets.py +0 -0
  177. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/format/__init__.py +0 -0
  178. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/format/test_v1.py +0 -0
  179. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/format/v1/__init__.py +0 -0
  180. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/format/v1/test_templates.py +0 -0
  181. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/llm/__init__.py +0 -0
  182. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/llm/test_v1.py +0 -0
  183. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/llm/v1/__init__.py +0 -0
  184. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/llm/v1/test_chat.py +0 -0
  185. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/ocr/__init__.py +0 -0
  186. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/search/__init__.py +0 -0
  187. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/search/test_v1.py +0 -0
  188. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/test_llm.py +0 -0
  189. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/vault/__init__.py +0 -0
  190. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/vault/test_graphrag.py +0 -0
  191. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/voice/__init__.py +0 -0
  192. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/voice/test_streaming.py +0 -0
  193. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/voice/test_transcription.py +0 -0
  194. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/voice/test_v1.py +0 -0
  195. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/voice/v1/__init__.py +0 -0
  196. {casedev-0.2.0 → casedev-0.3.0}/tests/api_resources/voice/v1/test_speak.py +0 -0
  197. {casedev-0.2.0 → casedev-0.3.0}/tests/conftest.py +0 -0
  198. {casedev-0.2.0 → casedev-0.3.0}/tests/sample_file.txt +0 -0
  199. {casedev-0.2.0 → casedev-0.3.0}/tests/test_client.py +0 -0
  200. {casedev-0.2.0 → casedev-0.3.0}/tests/test_deepcopy.py +0 -0
  201. {casedev-0.2.0 → casedev-0.3.0}/tests/test_extract_files.py +0 -0
  202. {casedev-0.2.0 → casedev-0.3.0}/tests/test_files.py +0 -0
  203. {casedev-0.2.0 → casedev-0.3.0}/tests/test_models.py +0 -0
  204. {casedev-0.2.0 → casedev-0.3.0}/tests/test_qs.py +0 -0
  205. {casedev-0.2.0 → casedev-0.3.0}/tests/test_required_args.py +0 -0
  206. {casedev-0.2.0 → casedev-0.3.0}/tests/test_response.py +0 -0
  207. {casedev-0.2.0 → casedev-0.3.0}/tests/test_streaming.py +0 -0
  208. {casedev-0.2.0 → casedev-0.3.0}/tests/test_transform.py +0 -0
  209. {casedev-0.2.0 → casedev-0.3.0}/tests/test_utils/test_datetime_parse.py +0 -0
  210. {casedev-0.2.0 → casedev-0.3.0}/tests/test_utils/test_proxy.py +0 -0
  211. {casedev-0.2.0 → casedev-0.3.0}/tests/test_utils/test_typing.py +0 -0
  212. {casedev-0.2.0 → casedev-0.3.0}/tests/utils.py +0 -0
  213. {casedev-0.2.0 → casedev-0.3.0}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.0"
3
+ }
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2026-01-31)
4
+
5
+ Full Changelog: [v0.2.0...v0.3.0](https://github.com/CaseMark/casedev-python/compare/v0.2.0...v0.3.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([9552466](https://github.com/CaseMark/casedev-python/commit/95524660fc8d6bc6b4afbd3e881bf15e7378cfe0))
10
+ * **api:** api update ([e3f5b6b](https://github.com/CaseMark/casedev-python/commit/e3f5b6bcc11924a87716cbb6e99d39e0c0603f74))
11
+ * **api:** api update ([ab9ad93](https://github.com/CaseMark/casedev-python/commit/ab9ad9365e44ec36f5ba3cb5c47436bcdcba095e))
12
+ * **api:** api update ([92d6d3e](https://github.com/CaseMark/casedev-python/commit/92d6d3e780ef1f21b3d5fb1839be1bb1973bdec9))
13
+ * **api:** api update ([c1ae1f0](https://github.com/CaseMark/casedev-python/commit/c1ae1f0f67d01c6131cea0a3cdfdd7b62430e57a))
14
+ * **client:** add custom JSON encoder for extended type support ([34a252e](https://github.com/CaseMark/casedev-python/commit/34a252ea9464e00bd27f8b12fcb027e283c095bd))
15
+
3
16
  ## 0.2.0 (2026-01-24)
4
17
 
5
18
  Full Changelog: [v0.1.0...v0.2.0](https://github.com/CaseMark/casedev-python/compare/v0.1.0...v0.2.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: casedev
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: The official Python library for the casedev API
5
5
  Project-URL: Homepage, https://github.com/CaseMark/casedev-python
6
6
  Project-URL: Repository, https://github.com/CaseMark/casedev-python
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "casedev"
3
- version = "0.2.0"
3
+ version = "0.3.0"
4
4
  description = "The official Python library for the casedev API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -86,6 +86,7 @@ from ._exceptions import (
86
86
  APIConnectionError,
87
87
  APIResponseValidationError,
88
88
  )
89
+ from ._utils._json import openapi_dumps
89
90
 
90
91
  log: logging.Logger = logging.getLogger(__name__)
91
92
 
@@ -554,8 +555,10 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
554
555
  kwargs["content"] = options.content
555
556
  elif isinstance(json_data, bytes):
556
557
  kwargs["content"] = json_data
557
- else:
558
- kwargs["json"] = json_data if is_given(json_data) else None
558
+ elif not files:
559
+ # Don't set content when JSON is sent as multipart/form-data,
560
+ # since httpx's content param overrides other body arguments
561
+ kwargs["content"] = openapi_dumps(json_data) if is_given(json_data) and json_data is not None else None
559
562
  kwargs["files"] = files
560
563
  else:
561
564
  headers.pop("Content-Type", None)
@@ -139,6 +139,7 @@ def model_dump(
139
139
  exclude_defaults: bool = False,
140
140
  warnings: bool = True,
141
141
  mode: Literal["json", "python"] = "python",
142
+ by_alias: bool | None = None,
142
143
  ) -> dict[str, Any]:
143
144
  if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
144
145
  return model.model_dump(
@@ -148,13 +149,12 @@ def model_dump(
148
149
  exclude_defaults=exclude_defaults,
149
150
  # warnings are not supported in Pydantic v1
150
151
  warnings=True if PYDANTIC_V1 else warnings,
152
+ by_alias=by_alias,
151
153
  )
152
154
  return cast(
153
155
  "dict[str, Any]",
154
156
  model.dict( # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
155
- exclude=exclude,
156
- exclude_unset=exclude_unset,
157
- exclude_defaults=exclude_defaults,
157
+ exclude=exclude, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, by_alias=bool(by_alias)
158
158
  ),
159
159
  )
160
160
 
@@ -0,0 +1,35 @@
1
+ import json
2
+ from typing import Any
3
+ from datetime import datetime
4
+ from typing_extensions import override
5
+
6
+ import pydantic
7
+
8
+ from .._compat import model_dump
9
+
10
+
11
+ def openapi_dumps(obj: Any) -> bytes:
12
+ """
13
+ Serialize an object to UTF-8 encoded JSON bytes.
14
+
15
+ Extends the standard json.dumps with support for additional types
16
+ commonly used in the SDK, such as `datetime`, `pydantic.BaseModel`, etc.
17
+ """
18
+ return json.dumps(
19
+ obj,
20
+ cls=_CustomEncoder,
21
+ # Uses the same defaults as httpx's JSON serialization
22
+ ensure_ascii=False,
23
+ separators=(",", ":"),
24
+ allow_nan=False,
25
+ ).encode()
26
+
27
+
28
+ class _CustomEncoder(json.JSONEncoder):
29
+ @override
30
+ def default(self, o: Any) -> Any:
31
+ if isinstance(o, datetime):
32
+ return o.isoformat()
33
+ if isinstance(o, pydantic.BaseModel):
34
+ return model_dump(o, exclude_unset=True, mode="json", by_alias=True)
35
+ return super().default(o)
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "casedev"
4
- __version__ = "0.2.0" # x-release-please-version
4
+ __version__ = "0.3.0" # x-release-please-version
@@ -149,7 +149,7 @@ class V1Resource(SyncAPIResource):
149
149
 
150
150
  engine: OCR engine to use
151
151
 
152
- features: OCR features to extract
152
+ features: Additional processing options
153
153
 
154
154
  result_bucket: S3 bucket to store results
155
155
 
@@ -309,7 +309,7 @@ class AsyncV1Resource(AsyncAPIResource):
309
309
 
310
310
  engine: OCR engine to use
311
311
 
312
- features: OCR features to extract
312
+ features: Additional processing options
313
313
 
314
314
  result_bucket: S3 bucket to store results
315
315
 
@@ -126,6 +126,7 @@ class ObjectsResource(SyncAPIResource):
126
126
  content_type: str | Omit = omit,
127
127
  expires_in: int | Omit = omit,
128
128
  operation: Literal["GET", "PUT", "DELETE", "HEAD"] | Omit = omit,
129
+ size_bytes: int | Omit = omit,
129
130
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
130
131
  # The extra values given here take precedence over values defined on the client or passed to this method.
131
132
  extra_headers: Headers | None = None,
@@ -146,6 +147,9 @@ class ObjectsResource(SyncAPIResource):
146
147
 
147
148
  operation: The S3 operation to generate URL for
148
149
 
150
+ size_bytes: File size in bytes (optional, max 500MB). When provided for PUT operations,
151
+ enforces exact file size at S3 level.
152
+
149
153
  extra_headers: Send extra headers
150
154
 
151
155
  extra_query: Add additional query parameters to the request
@@ -165,6 +169,7 @@ class ObjectsResource(SyncAPIResource):
165
169
  "content_type": content_type,
166
170
  "expires_in": expires_in,
167
171
  "operation": operation,
172
+ "size_bytes": size_bytes,
168
173
  },
169
174
  object_create_presigned_url_params.ObjectCreatePresignedURLParams,
170
175
  ),
@@ -354,6 +359,7 @@ class AsyncObjectsResource(AsyncAPIResource):
354
359
  content_type: str | Omit = omit,
355
360
  expires_in: int | Omit = omit,
356
361
  operation: Literal["GET", "PUT", "DELETE", "HEAD"] | Omit = omit,
362
+ size_bytes: int | Omit = omit,
357
363
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
358
364
  # The extra values given here take precedence over values defined on the client or passed to this method.
359
365
  extra_headers: Headers | None = None,
@@ -374,6 +380,9 @@ class AsyncObjectsResource(AsyncAPIResource):
374
380
 
375
381
  operation: The S3 operation to generate URL for
376
382
 
383
+ size_bytes: File size in bytes (optional, max 500MB). When provided for PUT operations,
384
+ enforces exact file size at S3 level.
385
+
377
386
  extra_headers: Send extra headers
378
387
 
379
388
  extra_query: Add additional query parameters to the request
@@ -393,6 +402,7 @@ class AsyncObjectsResource(AsyncAPIResource):
393
402
  "content_type": content_type,
394
403
  "expires_in": expires_in,
395
404
  "operation": operation,
405
+ "size_bytes": size_bytes,
396
406
  },
397
407
  object_create_presigned_url_params.ObjectCreatePresignedURLParams,
398
408
  ),
@@ -299,7 +299,7 @@ class VaultResource(SyncAPIResource):
299
299
  auto_index: bool | Omit = omit,
300
300
  metadata: object | Omit = omit,
301
301
  path: str | Omit = omit,
302
- size_bytes: float | Omit = omit,
302
+ size_bytes: int | Omit = omit,
303
303
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
304
304
  # The extra values given here take precedence over values defined on the client or passed to this method.
305
305
  extra_headers: Headers | None = None,
@@ -326,7 +326,8 @@ class VaultResource(SyncAPIResource):
326
326
  source folder structure from systems like NetDocs, Clio, or Smokeball. Example:
327
327
  '/Discovery/Depositions/2024'
328
328
 
329
- size_bytes: Estimated file size in bytes for cost calculation
329
+ size_bytes: File size in bytes (optional, max 500MB). When provided, enforces exact file
330
+ size at S3 level.
330
331
 
331
332
  extra_headers: Send extra headers
332
333
 
@@ -613,7 +614,7 @@ class AsyncVaultResource(AsyncAPIResource):
613
614
  auto_index: bool | Omit = omit,
614
615
  metadata: object | Omit = omit,
615
616
  path: str | Omit = omit,
616
- size_bytes: float | Omit = omit,
617
+ size_bytes: int | Omit = omit,
617
618
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
618
619
  # The extra values given here take precedence over values defined on the client or passed to this method.
619
620
  extra_headers: Headers | None = None,
@@ -640,7 +641,8 @@ class AsyncVaultResource(AsyncAPIResource):
640
641
  source folder structure from systems like NetDocs, Clio, or Smokeball. Example:
641
642
  '/Discovery/Depositions/2024'
642
643
 
643
- size_bytes: Estimated file size in bytes for cost calculation
644
+ size_bytes: File size in bytes (optional, max 500MB). When provided, enforces exact file
645
+ size at S3 level.
644
646
 
645
647
  extra_headers: Send extra headers
646
648
 
@@ -60,7 +60,7 @@ class StreamingResource(SyncAPIResource):
60
60
  - Encoding: PCM 16-bit little-endian
61
61
  - Channels: Mono (1 channel)
62
62
 
63
- **Pricing:** $0.30 per minute ($18.00 per hour)
63
+ **Pricing:** $0.01 per minute ($0.60 per hour)
64
64
  """
65
65
  return self._get(
66
66
  "/voice/streaming/url",
@@ -112,7 +112,7 @@ class AsyncStreamingResource(AsyncAPIResource):
112
112
  - Encoding: PCM 16-bit little-endian
113
113
  - Channels: Mono (1 channel)
114
114
 
115
- **Pricing:** $0.30 per minute ($18.00 per hour)
115
+ **Pricing:** $0.01 per minute ($0.60 per hour)
116
116
  """
117
117
  return await self._get(
118
118
  "/voice/streaming/url",
@@ -0,0 +1,54 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Dict, Union
6
+ from typing_extensions import Literal, Required, TypeAlias, TypedDict
7
+
8
+ __all__ = ["V1ProcessParams", "Features", "FeaturesTables"]
9
+
10
+
11
+ class V1ProcessParams(TypedDict, total=False):
12
+ document_url: Required[str]
13
+ """URL or S3 path to the document to process"""
14
+
15
+ callback_url: str
16
+ """URL to receive completion webhook"""
17
+
18
+ document_id: str
19
+ """Optional custom document identifier"""
20
+
21
+ engine: Literal["doctr", "paddleocr"]
22
+ """OCR engine to use"""
23
+
24
+ features: Features
25
+ """Additional processing options"""
26
+
27
+ result_bucket: str
28
+ """S3 bucket to store results"""
29
+
30
+ result_prefix: str
31
+ """S3 key prefix for results"""
32
+
33
+
34
+ class FeaturesTablesTyped(TypedDict, total=False):
35
+ """Extract tables as structured data"""
36
+
37
+ format: Literal["csv", "json"]
38
+ """Output format for extracted tables"""
39
+
40
+
41
+ FeaturesTables: TypeAlias = Union[FeaturesTablesTyped, Dict[str, object]]
42
+
43
+
44
+ class Features(TypedDict, total=False):
45
+ """Additional processing options"""
46
+
47
+ embed: Dict[str, object]
48
+ """Generate searchable PDF with text layer"""
49
+
50
+ forms: Dict[str, object]
51
+ """Detect and extract form fields"""
52
+
53
+ tables: FeaturesTables
54
+ """Extract tables as structured data"""
@@ -10,23 +10,23 @@ __all__ = ["V1RetrieveResponse"]
10
10
 
11
11
 
12
12
  class V1RetrieveResponse(BaseModel):
13
- id: Optional[str] = None
13
+ id: str
14
14
  """OCR job ID"""
15
15
 
16
+ created_at: datetime
17
+ """Job creation timestamp"""
18
+
19
+ status: Literal["pending", "processing", "completed", "failed"]
20
+ """Current job status"""
21
+
16
22
  completed_at: Optional[datetime] = None
17
23
  """Job completion timestamp"""
18
24
 
19
- created_at: Optional[datetime] = None
20
- """Job creation timestamp"""
21
-
22
25
  metadata: Optional[object] = None
23
26
  """Additional processing metadata"""
24
27
 
25
28
  page_count: Optional[int] = None
26
29
  """Number of pages processed"""
27
30
 
28
- status: Optional[Literal["pending", "processing", "completed", "failed"]] = None
29
- """Current job status"""
30
-
31
31
  text: Optional[str] = None
32
32
  """Extracted text content (when completed)"""
@@ -20,3 +20,9 @@ class ObjectCreatePresignedURLParams(TypedDict, total=False):
20
20
 
21
21
  operation: Literal["GET", "PUT", "DELETE", "HEAD"]
22
22
  """The S3 operation to generate URL for"""
23
+
24
+ size_bytes: Annotated[int, PropertyInfo(alias="sizeBytes")]
25
+ """File size in bytes (optional, max 500MB).
26
+
27
+ When provided for PUT operations, enforces exact file size at S3 level.
28
+ """
@@ -9,27 +9,27 @@ __all__ = ["ObjectGetTextResponse", "Metadata"]
9
9
 
10
10
 
11
11
  class Metadata(BaseModel):
12
- chunk_count: Optional[int] = None
12
+ chunk_count: int
13
13
  """Number of text chunks the document was split into"""
14
14
 
15
- filename: Optional[str] = None
15
+ filename: str
16
16
  """Original filename of the document"""
17
17
 
18
- ingestion_completed_at: Optional[datetime] = None
19
- """When the document processing completed"""
20
-
21
- length: Optional[int] = None
18
+ length: int
22
19
  """Total character count of the extracted text"""
23
20
 
24
- object_id: Optional[str] = None
21
+ object_id: str
25
22
  """The object ID"""
26
23
 
27
- vault_id: Optional[str] = None
24
+ vault_id: str
28
25
  """The vault ID"""
29
26
 
27
+ ingestion_completed_at: Optional[datetime] = None
28
+ """When the document processing completed"""
29
+
30
30
 
31
31
  class ObjectGetTextResponse(BaseModel):
32
- metadata: Optional[Metadata] = None
32
+ metadata: Metadata
33
33
 
34
- text: Optional[str] = None
34
+ text: str
35
35
  """Full concatenated text content from all chunks"""
@@ -11,27 +11,27 @@ __all__ = ["ObjectListResponse", "Object"]
11
11
 
12
12
 
13
13
  class Object(BaseModel):
14
- id: Optional[str] = None
14
+ id: str
15
15
  """Unique object identifier"""
16
16
 
17
- chunk_count: Optional[float] = FieldInfo(alias="chunkCount", default=None)
18
- """Number of text chunks created for vectorization"""
19
-
20
- content_type: Optional[str] = FieldInfo(alias="contentType", default=None)
17
+ content_type: str = FieldInfo(alias="contentType")
21
18
  """MIME type of the document"""
22
19
 
23
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
20
+ created_at: datetime = FieldInfo(alias="createdAt")
24
21
  """Document upload timestamp"""
25
22
 
26
- filename: Optional[str] = None
23
+ filename: str
27
24
  """Original filename of the uploaded document"""
28
25
 
26
+ ingestion_status: str = FieldInfo(alias="ingestionStatus")
27
+ """Processing status of the document"""
28
+
29
+ chunk_count: Optional[float] = FieldInfo(alias="chunkCount", default=None)
30
+ """Number of text chunks created for vectorization"""
31
+
29
32
  ingestion_completed_at: Optional[datetime] = FieldInfo(alias="ingestionCompletedAt", default=None)
30
33
  """Processing completion timestamp"""
31
34
 
32
- ingestion_status: Optional[str] = FieldInfo(alias="ingestionStatus", default=None)
33
- """Processing status of the document"""
34
-
35
35
  metadata: Optional[object] = None
36
36
  """Custom metadata associated with the document"""
37
37
 
@@ -55,10 +55,10 @@ class Object(BaseModel):
55
55
 
56
56
 
57
57
  class ObjectListResponse(BaseModel):
58
- count: Optional[float] = None
58
+ count: float
59
59
  """Total number of objects in the vault"""
60
60
 
61
- objects: Optional[List[Object]] = None
61
+ objects: List[Object]
62
62
 
63
- vault_id: Optional[str] = FieldInfo(alias="vaultId", default=None)
63
+ vault_id: str = FieldInfo(alias="vaultId")
64
64
  """The ID of the vault"""
@@ -11,30 +11,33 @@ __all__ = ["ObjectRetrieveResponse"]
11
11
 
12
12
 
13
13
  class ObjectRetrieveResponse(BaseModel):
14
- id: Optional[str] = None
14
+ id: str
15
15
  """Object ID"""
16
16
 
17
- chunk_count: Optional[int] = FieldInfo(alias="chunkCount", default=None)
18
- """Number of text chunks created"""
19
-
20
- content_type: Optional[str] = FieldInfo(alias="contentType", default=None)
17
+ content_type: str = FieldInfo(alias="contentType")
21
18
  """MIME type"""
22
19
 
23
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
20
+ created_at: datetime = FieldInfo(alias="createdAt")
24
21
  """Upload timestamp"""
25
22
 
26
- download_url: Optional[str] = FieldInfo(alias="downloadUrl", default=None)
23
+ download_url: str = FieldInfo(alias="downloadUrl")
27
24
  """Presigned S3 download URL"""
28
25
 
29
- expires_in: Optional[int] = FieldInfo(alias="expiresIn", default=None)
26
+ expires_in: int = FieldInfo(alias="expiresIn")
30
27
  """URL expiration time in seconds"""
31
28
 
32
- filename: Optional[str] = None
29
+ filename: str
33
30
  """Original filename"""
34
31
 
35
- ingestion_status: Optional[str] = FieldInfo(alias="ingestionStatus", default=None)
32
+ ingestion_status: str = FieldInfo(alias="ingestionStatus")
36
33
  """Processing status (pending, processing, completed, failed)"""
37
34
 
35
+ vault_id: str = FieldInfo(alias="vaultId")
36
+ """Vault ID"""
37
+
38
+ chunk_count: Optional[int] = FieldInfo(alias="chunkCount", default=None)
39
+ """Number of text chunks created"""
40
+
38
41
  metadata: Optional[object] = None
39
42
  """Additional metadata"""
40
43
 
@@ -50,8 +53,5 @@ class ObjectRetrieveResponse(BaseModel):
50
53
  text_length: Optional[int] = FieldInfo(alias="textLength", default=None)
51
54
  """Length of extracted text"""
52
55
 
53
- vault_id: Optional[str] = FieldInfo(alias="vaultId", default=None)
54
- """Vault ID"""
55
-
56
56
  vector_count: Optional[int] = FieldInfo(alias="vectorCount", default=None)
57
57
  """Number of embedding vectors generated"""
@@ -27,24 +27,30 @@ class ChunkStrategy(BaseModel):
27
27
 
28
28
 
29
29
  class VaultRetrieveResponse(BaseModel):
30
- id: Optional[str] = None
30
+ id: str
31
31
  """Vault identifier"""
32
32
 
33
+ created_at: datetime = FieldInfo(alias="createdAt")
34
+ """Vault creation timestamp"""
35
+
36
+ files_bucket: str = FieldInfo(alias="filesBucket")
37
+ """S3 bucket for document storage"""
38
+
39
+ name: str
40
+ """Vault name"""
41
+
42
+ region: str
43
+ """AWS region"""
44
+
33
45
  chunk_strategy: Optional[ChunkStrategy] = FieldInfo(alias="chunkStrategy", default=None)
34
46
  """Document chunking strategy configuration"""
35
47
 
36
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
37
- """Vault creation timestamp"""
38
-
39
48
  description: Optional[str] = None
40
49
  """Vault description"""
41
50
 
42
51
  enable_graph: Optional[bool] = FieldInfo(alias="enableGraph", default=None)
43
52
  """Whether GraphRAG is enabled"""
44
53
 
45
- files_bucket: Optional[str] = FieldInfo(alias="filesBucket", default=None)
46
- """S3 bucket for document storage"""
47
-
48
54
  index_name: Optional[str] = FieldInfo(alias="indexName", default=None)
49
55
  """Search index name"""
50
56
 
@@ -54,12 +60,6 @@ class VaultRetrieveResponse(BaseModel):
54
60
  metadata: Optional[object] = None
55
61
  """Additional vault metadata"""
56
62
 
57
- name: Optional[str] = None
58
- """Vault name"""
59
-
60
- region: Optional[str] = None
61
- """AWS region"""
62
-
63
63
  total_bytes: Optional[int] = FieldInfo(alias="totalBytes", default=None)
64
64
  """Total storage size in bytes"""
65
65
 
@@ -41,6 +41,20 @@ class Chunk(BaseModel):
41
41
  text: Optional[str] = None
42
42
  """Preview of the chunk text (up to 500 characters)"""
43
43
 
44
+ word_end_index: Optional[int] = None
45
+ """Ending word index (0-based) in the OCR word list.
46
+
47
+ Use with GET /vault/:id/objects/:objectId/ocr-words to retrieve bounding boxes
48
+ for highlighting.
49
+ """
50
+
51
+ word_start_index: Optional[int] = None
52
+ """Starting word index (0-based) in the OCR word list.
53
+
54
+ Use with GET /vault/:id/objects/:objectId/ocr-words to retrieve bounding boxes
55
+ for highlighting.
56
+ """
57
+
44
58
 
45
59
  class Source(BaseModel):
46
60
  id: Optional[str] = None
@@ -29,5 +29,8 @@ class VaultUploadParams(TypedDict, total=False):
29
29
  NetDocs, Clio, or Smokeball. Example: '/Discovery/Depositions/2024'
30
30
  """
31
31
 
32
- size_bytes: Annotated[float, PropertyInfo(alias="sizeBytes")]
33
- """Estimated file size in bytes for cost calculation"""
32
+ size_bytes: Annotated[int, PropertyInfo(alias="sizeBytes")]
33
+ """File size in bytes (optional, max 500MB).
34
+
35
+ When provided, enforces exact file size at S3 level.
36
+ """
@@ -122,10 +122,9 @@ class TestV1:
122
122
  document_id="contract-2024-001",
123
123
  engine="doctr",
124
124
  features={
125
- "forms": False,
126
- "layout": True,
127
- "tables": True,
128
- "text": True,
125
+ "embed": {},
126
+ "forms": {"foo": "bar"},
127
+ "tables": {"format": "csv"},
129
128
  },
130
129
  result_bucket="my-ocr-results",
131
130
  result_prefix="ocr/2024/",
@@ -269,10 +268,9 @@ class TestAsyncV1:
269
268
  document_id="contract-2024-001",
270
269
  engine="doctr",
271
270
  features={
272
- "forms": False,
273
- "layout": True,
274
- "tables": True,
275
- "text": True,
271
+ "embed": {},
272
+ "forms": {"foo": "bar"},
273
+ "tables": {"format": "csv"},
276
274
  },
277
275
  result_bucket="my-ocr-results",
278
276
  result_prefix="ocr/2024/",
@@ -273,7 +273,7 @@ class TestVault:
273
273
  auto_index=True,
274
274
  metadata={},
275
275
  path="path",
276
- size_bytes=0,
276
+ size_bytes=1,
277
277
  )
278
278
  assert_matches_type(VaultUploadResponse, vault, path=["response"])
279
279
 
@@ -572,7 +572,7 @@ class TestAsyncVault:
572
572
  auto_index=True,
573
573
  metadata={},
574
574
  path="path",
575
- size_bytes=0,
575
+ size_bytes=1,
576
576
  )
577
577
  assert_matches_type(VaultUploadResponse, vault, path=["response"])
578
578
 
@@ -134,6 +134,7 @@ class TestObjects:
134
134
  content_type="contentType",
135
135
  expires_in=60,
136
136
  operation="GET",
137
+ size_bytes=1,
137
138
  )
138
139
  assert_matches_type(ObjectCreatePresignedURLResponse, object_, path=["response"])
139
140
 
@@ -402,6 +403,7 @@ class TestAsyncObjects:
402
403
  content_type="contentType",
403
404
  expires_in=60,
404
405
  operation="GET",
406
+ size_bytes=1,
405
407
  )
406
408
  assert_matches_type(ObjectCreatePresignedURLResponse, object_, path=["response"])
407
409