kreuzberg 3.17.2__tar.gz → 3.17.3__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 (358) hide show
  1. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/ci.yaml +15 -9
  2. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/PKG-INFO +1 -1
  3. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/Taskfile.yml +3 -3
  4. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/ai-rulez.yaml +4 -3
  5. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/contributing.md +9 -5
  6. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_entity_extraction.py +38 -10
  7. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_language_detection.py +0 -2
  8. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/extraction.py +0 -1
  9. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/pyproject.toml +1 -2
  10. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/entity_extraction_test.py +68 -12
  11. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/language_detection_test.py +1 -12
  12. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/uv.lock +2 -71
  13. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.commitlintrc +0 -0
  14. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.deepsource.toml +0 -0
  15. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.docker/Dockerfile +0 -0
  16. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.docker/README.md +0 -0
  17. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.dockerignore +0 -0
  18. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/dependabot.yaml +0 -0
  19. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/docker-e2e-tests.yml +0 -0
  20. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/docs.yml +0 -0
  21. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/pr-title.yaml +0 -0
  22. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/publish-docker.yml +0 -0
  23. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/release.yaml +0 -0
  24. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.github/workflows/test-docker-builds.yml +0 -0
  25. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.gitignore +0 -0
  26. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.markdownlint.yaml +0 -0
  27. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.pre-commit-config.yaml +0 -0
  28. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/.prettierignore +0 -0
  29. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/ATTRIBUTIONS.md +0 -0
  30. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/LICENSE +0 -0
  31. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/README.md +0 -0
  32. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/README.md +0 -0
  33. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/__init__.py +0 -0
  34. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/batch_size_benchmark.py +0 -0
  35. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/batch_validation_benchmark.py +0 -0
  36. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/py.typed +0 -0
  37. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/pyproject.toml +0 -0
  38. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/__init__.py +0 -0
  39. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/__main__.py +0 -0
  40. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/benchmarks.py +0 -0
  41. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/cli.py +0 -0
  42. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/models.py +0 -0
  43. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/profiler.py +0 -0
  44. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/src/runner.py +0 -0
  45. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/benchmarks/token_reduction_compression_benchmark.py +0 -0
  46. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/advanced/custom-extractors.md +0 -0
  47. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/advanced/custom-hooks.md +0 -0
  48. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/advanced/error-handling.md +0 -0
  49. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/advanced/index.md +0 -0
  50. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/advanced/performance.md +0 -0
  51. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/api-reference/exceptions.md +0 -0
  52. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/api-reference/extraction-functions.md +0 -0
  53. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/api-reference/extractor-registry.md +0 -0
  54. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/api-reference/index.md +0 -0
  55. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/api-reference/ocr-configuration.md +0 -0
  56. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/api-reference/types.md +0 -0
  57. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/assets/favicon.png +0 -0
  58. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/assets/logo.png +0 -0
  59. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/cli.md +0 -0
  60. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/css/extra.css +0 -0
  61. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/examples/extraction-examples.md +0 -0
  62. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/examples/index.md +0 -0
  63. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/getting-started/index.md +0 -0
  64. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/getting-started/installation.md +0 -0
  65. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/getting-started/quick-start.md +0 -0
  66. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/index.md +0 -0
  67. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/api-server.md +0 -0
  68. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/basic-usage.md +0 -0
  69. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/chunking.md +0 -0
  70. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/docker.md +0 -0
  71. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/document-classification.md +0 -0
  72. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/extraction-configuration.md +0 -0
  73. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/index.md +0 -0
  74. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/mcp-server.md +0 -0
  75. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/metadata-extraction.md +0 -0
  76. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/ocr-backends.md +0 -0
  77. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/ocr-configuration.md +0 -0
  78. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/supported-formats.md +0 -0
  79. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/docs/user-guide/token-reduction.md +0 -0
  80. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/__init__.py +0 -0
  81. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/__main__.py +0 -0
  82. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_api/__init__.py +0 -0
  83. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_api/_config_cache.py +0 -0
  84. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_api/main.py +0 -0
  85. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_chunker.py +0 -0
  86. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_config.py +0 -0
  87. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_constants.py +0 -0
  88. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_document_classification.py +0 -0
  89. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/__init__.py +0 -0
  90. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_base.py +0 -0
  91. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_email.py +0 -0
  92. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_html.py +0 -0
  93. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_image.py +0 -0
  94. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_pandoc.py +0 -0
  95. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_pdf.py +0 -0
  96. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_presentation.py +0 -0
  97. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_spread_sheet.py +0 -0
  98. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_extractors/_structured.py +0 -0
  99. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_gmft.py +0 -0
  100. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_mcp/__init__.py +0 -0
  101. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_mcp/server.py +0 -0
  102. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_mime_types.py +0 -0
  103. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_ocr/__init__.py +0 -0
  104. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_ocr/_base.py +0 -0
  105. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_ocr/_easyocr.py +0 -0
  106. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_ocr/_paddleocr.py +0 -0
  107. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_ocr/_table_extractor.py +0 -0
  108. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_ocr/_tesseract.py +0 -0
  109. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_playa.py +0 -0
  110. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_registry.py +0 -0
  111. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/__init__.py +0 -0
  112. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/_reducer.py +0 -0
  113. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/_stopwords.py +0 -0
  114. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/af_stopwords.json +0 -0
  115. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ar_stopwords.json +0 -0
  116. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/bg_stopwords.json +0 -0
  117. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/bn_stopwords.json +0 -0
  118. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/br_stopwords.json +0 -0
  119. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ca_stopwords.json +0 -0
  120. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/cs_stopwords.json +0 -0
  121. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/da_stopwords.json +0 -0
  122. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/de_stopwords.json +0 -0
  123. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/el_stopwords.json +0 -0
  124. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/en_stopwords.json +0 -0
  125. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/eo_stopwords.json +0 -0
  126. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/es_stopwords.json +0 -0
  127. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/et_stopwords.json +0 -0
  128. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/eu_stopwords.json +0 -0
  129. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/fa_stopwords.json +0 -0
  130. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/fi_stopwords.json +0 -0
  131. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/fr_stopwords.json +0 -0
  132. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ga_stopwords.json +0 -0
  133. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/gl_stopwords.json +0 -0
  134. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/gu_stopwords.json +0 -0
  135. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ha_stopwords.json +0 -0
  136. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/he_stopwords.json +0 -0
  137. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/hi_stopwords.json +0 -0
  138. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/hr_stopwords.json +0 -0
  139. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/hu_stopwords.json +0 -0
  140. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/hy_stopwords.json +0 -0
  141. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/id_stopwords.json +0 -0
  142. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/it_stopwords.json +0 -0
  143. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ja_stopwords.json +0 -0
  144. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/kn_stopwords.json +0 -0
  145. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ko_stopwords.json +0 -0
  146. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ku_stopwords.json +0 -0
  147. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/la_stopwords.json +0 -0
  148. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/lt_stopwords.json +0 -0
  149. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/lv_stopwords.json +0 -0
  150. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ml_stopwords.json +0 -0
  151. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/mr_stopwords.json +0 -0
  152. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ms_stopwords.json +0 -0
  153. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ne_stopwords.json +0 -0
  154. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/nl_stopwords.json +0 -0
  155. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/no_stopwords.json +0 -0
  156. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/pl_stopwords.json +0 -0
  157. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/pt_stopwords.json +0 -0
  158. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ro_stopwords.json +0 -0
  159. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ru_stopwords.json +0 -0
  160. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/si_stopwords.json +0 -0
  161. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/sk_stopwords.json +0 -0
  162. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/sl_stopwords.json +0 -0
  163. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/so_stopwords.json +0 -0
  164. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/st_stopwords.json +0 -0
  165. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/sv_stopwords.json +0 -0
  166. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/sw_stopwords.json +0 -0
  167. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ta_stopwords.json +0 -0
  168. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/te_stopwords.json +0 -0
  169. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/th_stopwords.json +0 -0
  170. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/tl_stopwords.json +0 -0
  171. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/tr_stopwords.json +0 -0
  172. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/uk_stopwords.json +0 -0
  173. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/ur_stopwords.json +0 -0
  174. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/vi_stopwords.json +0 -0
  175. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/yo_stopwords.json +0 -0
  176. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/zh_stopwords.json +0 -0
  177. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_token_reduction/stopwords/zu_stopwords.json +0 -0
  178. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_types.py +0 -0
  179. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/__init__.py +0 -0
  180. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_cache.py +0 -0
  181. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_device.py +0 -0
  182. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_document_cache.py +0 -0
  183. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_errors.py +0 -0
  184. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_html_streaming.py +0 -0
  185. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_image_preprocessing.py +0 -0
  186. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_ocr_cache.py +0 -0
  187. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_pdf_lock.py +0 -0
  188. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_process_pool.py +0 -0
  189. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_quality.py +0 -0
  190. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_ref.py +0 -0
  191. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_resource_managers.py +0 -0
  192. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_serialization.py +0 -0
  193. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_string.py +0 -0
  194. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_sync.py +0 -0
  195. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_table.py +0 -0
  196. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/_utils/_tmp.py +0 -0
  197. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/cli.py +0 -0
  198. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/exceptions.py +0 -0
  199. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/kreuzberg/py.typed +0 -0
  200. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/mkdocs.yaml +0 -0
  201. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/__init__.py +0 -0
  202. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/__init__.py +0 -0
  203. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/config_cache_test.py +0 -0
  204. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/conftest.py +0 -0
  205. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/header_config_hashing_test.py +0 -0
  206. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/image_extraction_test.py +0 -0
  207. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/main_test.py +0 -0
  208. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/api/runtime_config_test.py +0 -0
  209. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/conftest.py +0 -0
  210. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/__init__.py +0 -0
  211. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/comprehensive_config_test.py +0 -0
  212. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/config_test.py +0 -0
  213. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/constants_test.py +0 -0
  214. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/dpi_configuration_test.py +0 -0
  215. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/exceptions_test.py +0 -0
  216. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/extraction_batch_test.py +0 -0
  217. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/extraction_test.py +0 -0
  218. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/html_to_markdown_config_test.py +0 -0
  219. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/image_ocr_result_test.py +0 -0
  220. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/init_test.py +0 -0
  221. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/main_test.py +0 -0
  222. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/mime_types_test.py +0 -0
  223. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/registry_test.py +0 -0
  224. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/core/types_test.py +0 -0
  225. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/e2e/__init__.py +0 -0
  226. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/e2e/docker_e2e.py +0 -0
  227. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/README_image_tests.md +0 -0
  228. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/__init__.py +0 -0
  229. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/base_extractor_test.py +0 -0
  230. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/base_memory_limits_test.py +0 -0
  231. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/base_ocr_processing_test.py +0 -0
  232. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/base_ocr_simple_test.py +0 -0
  233. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/email_error_paths_test.py +0 -0
  234. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/email_test.py +0 -0
  235. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/html_invalid_base64_test.py +0 -0
  236. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/html_test.py +0 -0
  237. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/image_deduplication_test.py +0 -0
  238. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/image_error_handling_test.py +0 -0
  239. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/image_error_simple_test.py +0 -0
  240. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/image_test.py +0 -0
  241. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/json_test.py +0 -0
  242. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/pandoc_metadata_test.py +0 -0
  243. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/pandoc_test.py +0 -0
  244. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/pdf_images_test.py +0 -0
  245. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/pdf_sync_images_test.py +0 -0
  246. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/pdf_test.py +0 -0
  247. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/presentation_test.py +0 -0
  248. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/spreadsheet_test.py +0 -0
  249. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/extractors/structured_test.py +0 -0
  250. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/__init__.py +0 -0
  251. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/chunker_test.py +0 -0
  252. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/document_classification_test.py +0 -0
  253. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/gmft_test.py +0 -0
  254. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/hooks_test.py +0 -0
  255. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/table_extraction_test.py +0 -0
  256. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/features/token_reduction_test.py +0 -0
  257. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/__init__.py +0 -0
  258. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/all_extractors_images_test.py +0 -0
  259. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/api/__init__.py +0 -0
  260. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/api/large_file_test.py +0 -0
  261. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/api/mounted_config_test.py +0 -0
  262. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/dpi_integration_test.py +0 -0
  263. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/multiprocessing/__init__.py +0 -0
  264. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/multiprocessing/gmft_integration_test.py +0 -0
  265. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/ocr/__init__.py +0 -0
  266. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/ocr/device_integration_test.py +0 -0
  267. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/ocr/tesseract_sync_formats_test.py +0 -0
  268. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/ocr/tesseract_tsv_integration_test.py +0 -0
  269. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/pandoc_images_test.py +0 -0
  270. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/pdf_images_test.py +0 -0
  271. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/pdf_real_images_test.py +0 -0
  272. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/pptx_complex_test.py +0 -0
  273. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/pptx_images_test.py +0 -0
  274. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/regression_test.py +0 -0
  275. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/integration/token_reduction_integration_test.py +0 -0
  276. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/interfaces/__init__.py +0 -0
  277. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/interfaces/cli_test.py +0 -0
  278. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/interfaces/mcp_server_test.py +0 -0
  279. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/mcp/__init__.py +0 -0
  280. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/mcp/mcp_server_test.py +0 -0
  281. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/multiprocessing/__init__.py +0 -0
  282. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/multiprocessing/gmft_isolated_test.py +0 -0
  283. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/multiprocessing/process_manager_test.py +0 -0
  284. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/multiprocessing/tesseract_pool_test.py +0 -0
  285. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/__init__.py +0 -0
  286. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/base_test.py +0 -0
  287. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/easyocr_test.py +0 -0
  288. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/init_test.py +0 -0
  289. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/paddleocr_test.py +0 -0
  290. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/tesseract_test.py +0 -0
  291. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/ocr/tesseract_tsv_test.py +0 -0
  292. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/performance/__init__.py +0 -0
  293. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/performance/large_pdf_perf_test.py +0 -0
  294. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/Xerox_AltaLink_series_mfp_sag_en-US 2.pdf +0 -0
  295. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/contract.txt +0 -0
  296. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/contract_test.txt +0 -0
  297. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/document.docx +0 -0
  298. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/email/sample-email.eml +0 -0
  299. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/excel-multi-sheet.xlsx +0 -0
  300. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/excel.xlsx +0 -0
  301. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/flower-no-text.jpg +0 -0
  302. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/form_test.txt +0 -0
  303. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/french-text.txt +0 -0
  304. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/german-text.txt +0 -0
  305. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/google-doc-document.pdf +0 -0
  306. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/html.html +0 -0
  307. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/images/test_hello_world.png +0 -0
  308. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/invoice_image.png +0 -0
  309. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/invoice_test.txt +0 -0
  310. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/complex_nested.json +0 -0
  311. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/aws_policy.json +0 -0
  312. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/earthquakes.geojson +0 -0
  313. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/github_emojis.json +0 -0
  314. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/iss_location.json +0 -0
  315. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/openapi_spec.json +0 -0
  316. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/package.json +0 -0
  317. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/real_world/rick_morty_character.json +0 -0
  318. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/sample-document.json +0 -0
  319. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/json/schema_test.json +0 -0
  320. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/layout-parser-ocr.jpg +0 -0
  321. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/markdown.md +0 -0
  322. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/non-ascii-text.pdf +0 -0
  323. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/non-searchable.pdf +0 -0
  324. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/ocr-image.jpg +0 -0
  325. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/pdfs_with_tables/large.pdf +0 -0
  326. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/pdfs_with_tables/medium.pdf +0 -0
  327. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/pdfs_with_tables/tiny.pdf +0 -0
  328. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/pitch-deck-presentation.pptx +0 -0
  329. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/receipt_test.txt +0 -0
  330. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/report_test.txt +0 -0
  331. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/sample-contract.pdf +0 -0
  332. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/scanned.pdf +0 -0
  333. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/searchable.pdf +0 -0
  334. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/sharable-web-guide.pdf +0 -0
  335. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/spanish-text.txt +0 -0
  336. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/tables/borderless_table.png +0 -0
  337. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/tables/complex_document.png +0 -0
  338. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/tables/simple_table.png +0 -0
  339. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/test-article.pdf +0 -0
  340. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/test-excel.xls +0 -0
  341. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/test_source_files/yaml/sample-config.yaml +0 -0
  342. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/__init__.py +0 -0
  343. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/cache_test.py +0 -0
  344. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/device_test.py +0 -0
  345. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/errors_test.py +0 -0
  346. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/ocr_cache_test.py +0 -0
  347. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/pdf_lock_test.py +0 -0
  348. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/playa_helpers_test.py +0 -0
  349. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/playa_metadata_test.py +0 -0
  350. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/playa_test.py +0 -0
  351. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/process_pool_test.py +0 -0
  352. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/quality_test.py +0 -0
  353. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/ref_test.py +0 -0
  354. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/serialization_test.py +0 -0
  355. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/string_test.py +0 -0
  356. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/sync_test.py +0 -0
  357. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/table_test.py +0 -0
  358. {kreuzberg-3.17.2 → kreuzberg-3.17.3}/tests/utils/tmp_test.py +0 -0
@@ -44,15 +44,21 @@ jobs:
44
44
  uv sync --all-extras --dev
45
45
  shell: bash
46
46
 
47
- - name: Load Cached Pre-Commit Dependencies
48
- id: cached-pre-commit-dependencies
47
+ - name: Install prek
48
+ run: |
49
+ # Install prek using uv (recommended method)
50
+ uv tool install prek
51
+ echo "$HOME/.local/bin" >> $GITHUB_PATH
52
+
53
+ - name: Load Cached Prek Dependencies
54
+ id: cached-prek-dependencies
49
55
  uses: actions/cache@v4
50
56
  with:
51
- path: ~/.cache/pre-commit/
52
- key: pre-commit|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
57
+ path: ~/.cache/prek/
58
+ key: prek|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
53
59
 
54
- - name: Execute Pre-Commit
55
- run: uv run pre-commit run --show-diff-on-failure --color=always --all-files
60
+ - name: Execute Prek
61
+ run: prek run --show-diff-on-failure --color=always --all-files
56
62
 
57
63
  coverage:
58
64
  needs: validate
@@ -119,7 +125,7 @@ jobs:
119
125
  shell: bash
120
126
 
121
127
  - name: Upload Coverage to DeepSource
122
- if: always()
128
+ if: always() && secrets.DEEPSOURCE_DSN != '' && needs.test-pr.result == 'success'
123
129
  env:
124
130
  DEEPSOURCE_DSN: ${{ secrets.DEEPSOURCE_DSN }}
125
131
  run: |
@@ -214,7 +220,7 @@ jobs:
214
220
 
215
221
  coverage-pr:
216
222
  needs: test-pr
217
- if: github.event_name == 'pull_request' && always()
223
+ if: github.event_name == 'pull_request' && needs.test-pr.result == 'success'
218
224
  runs-on: ubuntu-latest
219
225
  timeout-minutes: 10
220
226
  steps:
@@ -227,7 +233,7 @@ jobs:
227
233
  name: coverage-pr-${{ github.sha }}
228
234
 
229
235
  - name: Upload Coverage to DeepSource
230
- if: always()
236
+ if: always() && secrets.DEEPSOURCE_DSN != '' && needs.test-pr.result == 'success'
231
237
  env:
232
238
  DEEPSOURCE_DSN: ${{ secrets.DEEPSOURCE_DSN }}
233
239
  run: |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kreuzberg
3
- Version: 3.17.2
3
+ Version: 3.17.3
4
4
  Summary: Document intelligence framework for Python - Extract text, metadata, and structured data from diverse file formats
5
5
  Project-URL: documentation, https://kreuzberg.dev
6
6
  Project-URL: homepage, https://github.com/Goldziher/kreuzberg
@@ -9,7 +9,7 @@ tasks:
9
9
  desc: "Install dependencies with uv"
10
10
  cmds:
11
11
  - uv sync --all-extras --all-packages
12
- - pre-commit install && pre-commit install -hook-type commit-msg
12
+ - prek install && prek install --hook-type commit-msg
13
13
 
14
14
  update:
15
15
  desc: "Update the dependencies"
@@ -17,7 +17,7 @@ tasks:
17
17
  - uv run uv-bump
18
18
  - cd benchmarks && uv run uv-bump && cd -
19
19
  - uv sync --all-extras --all-packages --upgrade
20
- - pre-commit autoupdate
20
+ - prek autoupdate
21
21
 
22
22
  test:
23
23
  desc: "Run tests with pytest"
@@ -32,7 +32,7 @@ tasks:
32
32
  lint:
33
33
  desc: "Lint code with ruff and docs with markdownlint"
34
34
  cmds:
35
- - pre-commit run --all-files
35
+ - prek run --all-files
36
36
 
37
37
  docs:build:
38
38
  desc: "Build documentation"
@@ -368,9 +368,10 @@ rules:
368
368
  - Fix linting issues: `ruff check --fix`
369
369
  - Type check: `mypy`
370
370
 
371
- ### Pre-commit
372
- - Install hooks: `pre-commit install && pre-commit install --hook-type commit-msg`
373
- - Run manually: `pre-commit run --all-files`
371
+ ### Prek
372
+ - Install prek: `uv tool install prek`
373
+ - Install hooks: `prek install && prek install --hook-type commit-msg`
374
+ - Run manually: `prek run --all-files`
374
375
 
375
376
  ### Documentation
376
377
  - Build docs: `uv run mkdocs build --clean --strict`
@@ -18,10 +18,14 @@ Thank you for contributing to Kreuzberg!
18
18
  uv sync --all-extras --dev
19
19
  ```
20
20
 
21
- 1. **Install pre-commit hooks**:
21
+ 1. **Install prek and hooks**:
22
22
 
23
23
  ```bash
24
- pre-commit install && pre-commit install --hook-type commit-msg
24
+ # Install prek using uv (recommended)
25
+ uv tool install prek
26
+
27
+ # Install git hooks
28
+ prek install && prek install --hook-type commit-msg
25
29
  ```
26
30
 
27
31
  ## Development
@@ -42,8 +46,8 @@ uv run ruff check # Lint
42
46
  uv run ruff check --fix # Auto-fix issues
43
47
  uv run mypy # Type check
44
48
 
45
- # Pre-commit
46
- uv run pre-commit run --all-files # Run all checks manually
49
+ # Prek
50
+ prek run --all-files # Run all checks manually
47
51
 
48
52
  # Documentation
49
53
  uv run mkdocs serve # Serve docs locally
@@ -70,7 +74,7 @@ Use [Conventional Commits](https://www.conventionalcommits.org/):
70
74
 
71
75
  - Python 3.10-3.13 supported
72
76
  - System dependencies (optional): Tesseract, Pandoc
73
- - Pre-commit runs automatically on commit
77
+ - Prek runs automatically on commit
74
78
  - Join our [Discord](https://discord.gg/pXxagNK2zN) for help
75
79
 
76
80
  ## License
@@ -2,12 +2,14 @@ from __future__ import annotations
2
2
 
3
3
  import os
4
4
  import re
5
+ import subprocess
6
+ import sys
5
7
  from functools import lru_cache
6
8
  from itertools import chain
7
9
  from typing import TYPE_CHECKING, Any
8
10
 
9
11
  from kreuzberg._types import Entity, SpacyEntityExtractionConfig
10
- from kreuzberg.exceptions import MissingDependencyError
12
+ from kreuzberg.exceptions import KreuzbergError, MissingDependencyError
11
13
 
12
14
  if TYPE_CHECKING:
13
15
  from collections.abc import Sequence
@@ -49,8 +51,6 @@ def extract_entities(
49
51
  return entities
50
52
 
51
53
  nlp = _load_spacy_model(model_name, spacy_config)
52
- if not nlp:
53
- return entities
54
54
 
55
55
  if len(text) > spacy_config.max_doc_length:
56
56
  text = text[: spacy_config.max_doc_length]
@@ -77,17 +77,45 @@ def extract_entities(
77
77
  def _load_spacy_model(model_name: str, spacy_config: SpacyEntityExtractionConfig) -> Any:
78
78
  try:
79
79
  import spacy # noqa: PLC0415
80
+ except ImportError:
81
+ return None
80
82
 
81
- if spacy_config.model_cache_dir:
82
- os.environ["SPACY_DATA"] = str(spacy_config.model_cache_dir)
83
+ if spacy_config.model_cache_dir:
84
+ os.environ["SPACY_DATA"] = str(spacy_config.model_cache_dir)
83
85
 
86
+ try:
84
87
  nlp = spacy.load(model_name)
88
+ except OSError:
89
+ result = subprocess.run(
90
+ [sys.executable, "-m", "spacy", "download", model_name],
91
+ capture_output=True,
92
+ text=True,
93
+ check=False,
94
+ )
85
95
 
86
- nlp.max_length = spacy_config.max_doc_length
87
-
88
- return nlp
89
- except (OSError, ImportError):
90
- return None
96
+ if result.returncode != 0:
97
+ error_msg = (
98
+ f"Failed to download spaCy model '{model_name}'. "
99
+ f"Please install it manually with: python -m spacy download {model_name}"
100
+ )
101
+ if result.stderr:
102
+ error_msg += f"\nError details: {result.stderr}"
103
+ raise KreuzbergError(
104
+ error_msg, context={"model": model_name, "stderr": result.stderr, "return_code": result.returncode}
105
+ ) from None
106
+
107
+ try:
108
+ nlp = spacy.load(model_name)
109
+ except OSError as e:
110
+ raise KreuzbergError(
111
+ f"Failed to load spaCy model '{model_name}' even after successful download. "
112
+ f"Please verify your spaCy installation and try reinstalling the model.",
113
+ context={"model": model_name, "error": str(e)},
114
+ ) from e
115
+
116
+ nlp.max_length = spacy_config.max_doc_length
117
+
118
+ return nlp
91
119
 
92
120
 
93
121
  def _select_spacy_model(languages: list[str] | None, spacy_config: SpacyEntityExtractionConfig) -> str | None:
@@ -23,9 +23,7 @@ def detect_languages(text: str, config: LanguageDetectionConfig | None = None) -
23
23
  config = LanguageDetectionConfig()
24
24
 
25
25
  try:
26
- # detect always returns a list, use k parameter for multiple languages
27
26
  k = config.top_k if config.multilingual else 1
28
- # Use the model from config directly
29
27
  model = config.model
30
28
  results = detect(text, model=model, k=k)
31
29
 
@@ -76,7 +76,6 @@ def _validate_and_post_process_helper(
76
76
  result.keywords = None
77
77
 
78
78
  if config.auto_detect_language:
79
- # Use provided config or create one with the model from ExtractionConfig
80
79
  lang_config = config.language_detection_config
81
80
  if lang_config is None:
82
81
  from kreuzberg._types import LanguageDetectionConfig # noqa: PLC0415
@@ -5,7 +5,7 @@ requires = [ "hatchling" ]
5
5
 
6
6
  [project]
7
7
  name = "kreuzberg"
8
- version = "3.17.2"
8
+ version = "3.17.3"
9
9
  description = "Document intelligence framework for Python - Extract text, metadata, and structured data from diverse file formats"
10
10
  readme = "README.md"
11
11
  keywords = [
@@ -111,7 +111,6 @@ scripts.kreuzberg-mcp = "kreuzberg._mcp.server:main"
111
111
  dev = [
112
112
  "covdefaults>=2.3.0",
113
113
  "mypy>=1.18.2",
114
- "pre-commit>=4.3.0",
115
114
  "pytest>=8.4.2",
116
115
  "pytest-cov>=7.0.0",
117
116
  "pytest-mock>=3.15.1",
@@ -11,7 +11,7 @@ from kreuzberg._entity_extraction import (
11
11
  extract_keywords,
12
12
  )
13
13
  from kreuzberg._types import SpacyEntityExtractionConfig
14
- from kreuzberg.exceptions import MissingDependencyError
14
+ from kreuzberg.exceptions import KreuzbergError, MissingDependencyError
15
15
 
16
16
 
17
17
  def test_extract_entities_with_custom_patterns_only() -> None:
@@ -58,11 +58,11 @@ def test_extract_entities_spacy_load_fails() -> None:
58
58
 
59
59
  with (
60
60
  patch("kreuzberg._entity_extraction._select_spacy_model", return_value="en_core_web_sm"),
61
- patch("kreuzberg._entity_extraction._load_spacy_model", return_value=None),
61
+ patch("kreuzberg._entity_extraction._load_spacy_model") as mock_load,
62
62
  ):
63
- entities = extract_entities(text)
64
-
65
- assert entities == []
63
+ mock_load.side_effect = KreuzbergError("Model download failed")
64
+ with pytest.raises(KreuzbergError, match="Model download failed"):
65
+ extract_entities(text)
66
66
 
67
67
 
68
68
  def test_extract_entities_with_spacy_success() -> None:
@@ -216,26 +216,82 @@ def test_load_spacy_model_with_cache_dir() -> None:
216
216
  os.environ.update(original_env)
217
217
 
218
218
 
219
- def test_load_spacy_model_failure() -> None:
219
+ def test_load_spacy_model_auto_download_success() -> None:
220
220
  config = SpacyEntityExtractionConfig()
221
221
 
222
222
  mock_spacy = Mock()
223
- mock_spacy.load.side_effect = OSError("Model not found")
223
+ mock_nlp = Mock()
224
+ mock_spacy.load.side_effect = [OSError("Model not found"), mock_nlp]
224
225
 
225
- with patch.dict("sys.modules", {"spacy": mock_spacy}):
226
+ mock_subprocess = Mock()
227
+ mock_subprocess.run.return_value.returncode = 0
228
+
229
+ with (
230
+ patch.dict("sys.modules", {"spacy": mock_spacy}),
231
+ patch("subprocess.run", mock_subprocess.run),
232
+ ):
226
233
  _load_spacy_model.cache_clear()
227
234
  result = _load_spacy_model("en_core_web_sm", config)
228
235
 
229
- assert result is None
236
+ assert result == mock_nlp
237
+ assert mock_nlp.max_length == config.max_doc_length
238
+ assert mock_spacy.load.call_count == 2
239
+ mock_subprocess.run.assert_called_once()
230
240
 
241
+ call_args = mock_subprocess.run.call_args[0][0]
242
+ assert "-m" in call_args
243
+ assert "spacy" in call_args
244
+ assert "download" in call_args
245
+ assert "en_core_web_sm" in call_args
231
246
 
232
- def test_load_spacy_model_import_error() -> None:
247
+
248
+ def test_load_spacy_model_download_then_load_failure() -> None:
233
249
  config = SpacyEntityExtractionConfig()
234
250
 
235
251
  mock_spacy = Mock()
236
- mock_spacy.load.side_effect = ImportError("Module not found")
252
+ mock_spacy.load.side_effect = [OSError("Model not found"), OSError("Load failed")]
237
253
 
238
- with patch.dict("sys.modules", {"spacy": mock_spacy}):
254
+ mock_subprocess = Mock()
255
+ mock_subprocess.run.return_value.returncode = 0
256
+
257
+ with (
258
+ patch.dict("sys.modules", {"spacy": mock_spacy}),
259
+ patch("subprocess.run", mock_subprocess.run),
260
+ ):
261
+ _load_spacy_model.cache_clear()
262
+ with pytest.raises(KreuzbergError, match="Failed to load spaCy model"):
263
+ _load_spacy_model("en_core_web_sm", config)
264
+
265
+ assert mock_spacy.load.call_count == 2
266
+ mock_subprocess.run.assert_called_once()
267
+
268
+
269
+ def test_load_spacy_model_auto_download_failure() -> None:
270
+ config = SpacyEntityExtractionConfig()
271
+
272
+ mock_spacy = Mock()
273
+ mock_spacy.load.side_effect = OSError("Model not found")
274
+
275
+ mock_subprocess = Mock()
276
+ mock_subprocess.run.return_value.returncode = 1
277
+ mock_subprocess.run.return_value.stderr = "Download error"
278
+
279
+ with (
280
+ patch.dict("sys.modules", {"spacy": mock_spacy}),
281
+ patch("subprocess.run", mock_subprocess.run),
282
+ ):
283
+ _load_spacy_model.cache_clear()
284
+ with pytest.raises(KreuzbergError, match="Failed to download spaCy model"):
285
+ _load_spacy_model("en_core_web_sm", config)
286
+
287
+ mock_spacy.load.assert_called_once_with("en_core_web_sm")
288
+ mock_subprocess.run.assert_called_once()
289
+
290
+
291
+ def test_load_spacy_model_import_error() -> None:
292
+ config = SpacyEntityExtractionConfig()
293
+
294
+ with patch.dict("sys.modules", {"spacy": None}):
239
295
  _load_spacy_model.cache_clear()
240
296
  result = _load_spacy_model("en_core_web_sm", config)
241
297
 
@@ -23,7 +23,6 @@ def clear_language_detection_cache() -> Generator[None, None, None]:
23
23
  def test_detect_languages_when_library_missing() -> None:
24
24
  text = "This is some English text."
25
25
 
26
- # Mock the import statement inside the function
27
26
  with patch.dict("sys.modules", {"fast_langdetect": None}):
28
27
  with pytest.raises(MissingDependencyError) as exc_info:
29
28
  detect_languages(text)
@@ -224,7 +223,6 @@ def test_detect_languages_cache_different_configs() -> None:
224
223
  mock_detect.assert_any_call(text, model="auto", k=2)
225
224
 
226
225
 
227
- # Real integration tests without mocks
228
226
  def test_detect_languages_real_single_language() -> None:
229
227
  text = "This is definitely an English text with multiple sentences. It should be detected as English."
230
228
  result = detect_languages(text)
@@ -235,24 +233,20 @@ def test_detect_languages_real_single_language() -> None:
235
233
 
236
234
 
237
235
  def test_detect_languages_real_multilingual() -> None:
238
- # Text with mixed languages
239
236
  text = "Hello world. Bonjour le monde. Hola mundo. Ciao mondo."
240
237
  config = LanguageDetectionConfig(multilingual=True, top_k=4)
241
238
  result = detect_languages(text, config)
242
239
 
243
240
  assert result is not None
244
241
  assert len(result) >= 1
245
- # The exact languages detected may vary, but we should get at least one
246
242
  assert all(isinstance(lang, str) for lang in result)
247
- assert all(len(lang) == 2 for lang in result) # Language codes should be 2 chars
243
+ assert all(len(lang) == 2 for lang in result)
248
244
 
249
245
 
250
246
  def test_detect_languages_real_empty_text() -> None:
251
247
  text = ""
252
248
  result = detect_languages(text)
253
249
 
254
- # Empty text should return None or raise an exception (caught and returns None)
255
- # Note: fast_langdetect may return a default language for empty text
256
250
  assert result is None or (isinstance(result, list) and len(result) <= 1)
257
251
 
258
252
 
@@ -272,7 +266,6 @@ def test_detect_languages_real_french_text() -> None:
272
266
 
273
267
  assert result is not None
274
268
  assert len(result) == 1
275
- # Note: Model accuracy may vary, checking that we get a valid language code
276
269
  assert isinstance(result[0], str)
277
270
  assert len(result[0]) == 2
278
271
 
@@ -283,7 +276,6 @@ def test_detect_languages_real_german_text() -> None:
283
276
 
284
277
  assert result is not None
285
278
  assert len(result) == 1
286
- # Note: Model accuracy may vary, checking that we get a valid language code
287
279
  assert isinstance(result[0], str)
288
280
  assert len(result[0]) == 2
289
281
 
@@ -294,19 +286,16 @@ def test_detect_languages_real_spanish_text() -> None:
294
286
 
295
287
  assert result is not None
296
288
  assert len(result) == 1
297
- # Note: Model accuracy may vary, checking that we get a valid language code
298
289
  assert isinstance(result[0], str)
299
290
  assert len(result[0]) == 2
300
291
 
301
292
 
302
293
  def test_detect_languages_real_mixed_languages_with_top_k() -> None:
303
- # Text with multiple languages - should detect top languages
304
294
  text = "English text. Texte français. Deutscher Text. Texto español."
305
295
  config = LanguageDetectionConfig(multilingual=True, top_k=2)
306
296
  result = detect_languages(text, config)
307
297
 
308
298
  assert result is not None
309
- # Should detect at least 1, up to 2 languages
310
299
  assert 1 <= len(result) <= 2
311
300
  assert all(isinstance(lang, str) for lang in result)
312
301
  assert all(len(lang) == 2 for lang in result)
@@ -311,15 +311,6 @@ wheels = [
311
311
  { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
312
312
  ]
313
313
 
314
- [[package]]
315
- name = "cfgv"
316
- version = "3.4.0"
317
- source = { registry = "https://pypi.org/simple" }
318
- sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" }
319
- wheels = [
320
- { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" },
321
- ]
322
-
323
314
  [[package]]
324
315
  name = "chardet"
325
316
  version = "5.2.0"
@@ -972,15 +963,6 @@ wheels = [
972
963
  { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
973
964
  ]
974
965
 
975
- [[package]]
976
- name = "distlib"
977
- version = "0.4.0"
978
- source = { registry = "https://pypi.org/simple" }
979
- sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
980
- wheels = [
981
- { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
982
- ]
983
-
984
966
  [[package]]
985
967
  name = "easyocr"
986
968
  version = "1.7.2"
@@ -1019,7 +1001,7 @@ name = "exceptiongroup"
1019
1001
  version = "1.3.0"
1020
1002
  source = { registry = "https://pypi.org/simple" }
1021
1003
  dependencies = [
1022
- { name = "typing-extensions", marker = "python_full_version < '3.13'" },
1004
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
1023
1005
  ]
1024
1006
  sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
1025
1007
  wheels = [
@@ -1440,15 +1422,6 @@ wheels = [
1440
1422
  { url = "https://files.pythonhosted.org/packages/fe/85/a18508becfa01f1e4351b5e18651b06d210dbd96debccd48a452acccb901/huggingface_hub-0.35.0-py3-none-any.whl", hash = "sha256:f2e2f693bca9a26530b1c0b9bcd4c1495644dad698e6a0060f90e22e772c31e9", size = 563436, upload-time = "2025-09-16T13:49:30.627Z" },
1441
1423
  ]
1442
1424
 
1443
- [[package]]
1444
- name = "identify"
1445
- version = "2.6.14"
1446
- source = { registry = "https://pypi.org/simple" }
1447
- sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload-time = "2025-09-06T19:30:52.938Z" }
1448
- wheels = [
1449
- { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload-time = "2025-09-06T19:30:51.759Z" },
1450
- ]
1451
-
1452
1425
  [[package]]
1453
1426
  name = "idna"
1454
1427
  version = "3.10"
@@ -1695,7 +1668,7 @@ wheels = [
1695
1668
 
1696
1669
  [[package]]
1697
1670
  name = "kreuzberg"
1698
- version = "3.17.1"
1671
+ version = "3.17.2"
1699
1672
  source = { editable = "." }
1700
1673
  dependencies = [
1701
1674
  { name = "anyio" },
@@ -1779,7 +1752,6 @@ paddleocr = [
1779
1752
  dev = [
1780
1753
  { name = "covdefaults" },
1781
1754
  { name = "mypy" },
1782
- { name = "pre-commit" },
1783
1755
  { name = "pytest" },
1784
1756
  { name = "pytest-cov" },
1785
1757
  { name = "pytest-mock" },
@@ -1841,7 +1813,6 @@ provides-extras = ["additional-extensions", "all", "api", "chunking", "cli", "cr
1841
1813
  dev = [
1842
1814
  { name = "covdefaults", specifier = ">=2.3.0" },
1843
1815
  { name = "mypy", specifier = ">=1.18.2" },
1844
- { name = "pre-commit", specifier = ">=4.3.0" },
1845
1816
  { name = "pytest", specifier = ">=8.4.2" },
1846
1817
  { name = "pytest-cov", specifier = ">=7.0.0" },
1847
1818
  { name = "pytest-mock", specifier = ">=3.15.1" },
@@ -2916,15 +2887,6 @@ wheels = [
2916
2887
  { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" },
2917
2888
  ]
2918
2889
 
2919
- [[package]]
2920
- name = "nodeenv"
2921
- version = "1.9.1"
2922
- source = { registry = "https://pypi.org/simple" }
2923
- sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" }
2924
- wheels = [
2925
- { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" },
2926
- ]
2927
-
2928
2890
  [[package]]
2929
2891
  name = "numpy"
2930
2892
  version = "2.2.6"
@@ -3659,22 +3621,6 @@ wheels = [
3659
3621
  { url = "https://files.pythonhosted.org/packages/e7/fe/d52c90e07c458f38b26f9972a25cb011b2744813f76fcd6121dde64744fa/polyfactory-2.22.2-py3-none-any.whl", hash = "sha256:9bea58ac9a80375b4153cd60820f75e558b863e567e058794d28c6a52b84118a", size = 63715, upload-time = "2025-08-15T06:23:19.664Z" },
3660
3622
  ]
3661
3623
 
3662
- [[package]]
3663
- name = "pre-commit"
3664
- version = "4.3.0"
3665
- source = { registry = "https://pypi.org/simple" }
3666
- dependencies = [
3667
- { name = "cfgv" },
3668
- { name = "identify" },
3669
- { name = "nodeenv" },
3670
- { name = "pyyaml" },
3671
- { name = "virtualenv" },
3672
- ]
3673
- sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" }
3674
- wheels = [
3675
- { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" },
3676
- ]
3677
-
3678
3624
  [[package]]
3679
3625
  name = "preshed"
3680
3626
  version = "3.0.10"
@@ -5909,21 +5855,6 @@ wheels = [
5909
5855
  { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" },
5910
5856
  ]
5911
5857
 
5912
- [[package]]
5913
- name = "virtualenv"
5914
- version = "20.34.0"
5915
- source = { registry = "https://pypi.org/simple" }
5916
- dependencies = [
5917
- { name = "distlib" },
5918
- { name = "filelock" },
5919
- { name = "platformdirs" },
5920
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
5921
- ]
5922
- sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" }
5923
- wheels = [
5924
- { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" },
5925
- ]
5926
-
5927
5858
  [[package]]
5928
5859
  name = "wasabi"
5929
5860
  version = "1.1.3"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes