kreuzberg 4.0.8 → 4.1.0

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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/README.md +1 -1
  4. data/ext/kreuzberg_rb/native/Cargo.lock +94 -98
  5. data/ext/kreuzberg_rb/native/Cargo.toml +4 -2
  6. data/ext/kreuzberg_rb/native/src/batch.rs +139 -0
  7. data/ext/kreuzberg_rb/native/src/config/mod.rs +10 -0
  8. data/ext/kreuzberg_rb/native/src/config/types.rs +1058 -0
  9. data/ext/kreuzberg_rb/native/src/error_handling.rs +125 -0
  10. data/ext/kreuzberg_rb/native/src/extraction.rs +79 -0
  11. data/ext/kreuzberg_rb/native/src/gc_guarded_value.rs +35 -0
  12. data/ext/kreuzberg_rb/native/src/helpers.rs +176 -0
  13. data/ext/kreuzberg_rb/native/src/lib.rs +342 -3622
  14. data/ext/kreuzberg_rb/native/src/metadata.rs +34 -0
  15. data/ext/kreuzberg_rb/native/src/plugins/mod.rs +92 -0
  16. data/ext/kreuzberg_rb/native/src/plugins/ocr_backend.rs +159 -0
  17. data/ext/kreuzberg_rb/native/src/plugins/post_processor.rs +126 -0
  18. data/ext/kreuzberg_rb/native/src/plugins/validator.rs +99 -0
  19. data/ext/kreuzberg_rb/native/src/result.rs +326 -0
  20. data/ext/kreuzberg_rb/native/src/validation.rs +4 -0
  21. data/lib/kreuzberg/config.rb +66 -0
  22. data/lib/kreuzberg/result.rb +107 -2
  23. data/lib/kreuzberg/types.rb +104 -0
  24. data/lib/kreuzberg/version.rb +1 -1
  25. data/lib/kreuzberg.rb +0 -4
  26. data/sig/kreuzberg.rbs +105 -1
  27. data/vendor/Cargo.toml +3 -3
  28. data/vendor/kreuzberg/Cargo.toml +4 -3
  29. data/vendor/kreuzberg/README.md +1 -1
  30. data/vendor/kreuzberg/src/api/config.rs +69 -0
  31. data/vendor/kreuzberg/src/api/handlers.rs +99 -2
  32. data/vendor/kreuzberg/src/api/mod.rs +14 -7
  33. data/vendor/kreuzberg/src/api/router.rs +214 -0
  34. data/vendor/kreuzberg/src/api/startup.rs +243 -0
  35. data/vendor/kreuzberg/src/api/types.rs +78 -0
  36. data/vendor/kreuzberg/src/cache/cleanup.rs +277 -0
  37. data/vendor/kreuzberg/src/cache/core.rs +428 -0
  38. data/vendor/kreuzberg/src/cache/mod.rs +21 -843
  39. data/vendor/kreuzberg/src/cache/utilities.rs +156 -0
  40. data/vendor/kreuzberg/src/chunking/boundaries.rs +301 -0
  41. data/vendor/kreuzberg/src/chunking/builder.rs +294 -0
  42. data/vendor/kreuzberg/src/chunking/config.rs +52 -0
  43. data/vendor/kreuzberg/src/chunking/core.rs +1017 -0
  44. data/vendor/kreuzberg/src/chunking/mod.rs +14 -2211
  45. data/vendor/kreuzberg/src/chunking/processor.rs +10 -0
  46. data/vendor/kreuzberg/src/chunking/validation.rs +686 -0
  47. data/vendor/kreuzberg/src/core/config/extraction/core.rs +169 -0
  48. data/vendor/kreuzberg/src/core/config/extraction/env.rs +179 -0
  49. data/vendor/kreuzberg/src/core/config/extraction/loaders.rs +204 -0
  50. data/vendor/kreuzberg/src/core/config/extraction/mod.rs +42 -0
  51. data/vendor/kreuzberg/src/core/config/extraction/types.rs +93 -0
  52. data/vendor/kreuzberg/src/core/config/formats.rs +135 -0
  53. data/vendor/kreuzberg/src/core/config/mod.rs +20 -0
  54. data/vendor/kreuzberg/src/core/config/ocr.rs +73 -0
  55. data/vendor/kreuzberg/src/core/config/page.rs +57 -0
  56. data/vendor/kreuzberg/src/core/config/pdf.rs +111 -0
  57. data/vendor/kreuzberg/src/core/config/processing.rs +312 -0
  58. data/vendor/kreuzberg/src/core/config_validation/dependencies.rs +187 -0
  59. data/vendor/kreuzberg/src/core/config_validation/mod.rs +386 -0
  60. data/vendor/kreuzberg/src/core/config_validation/sections.rs +401 -0
  61. data/vendor/kreuzberg/src/core/extractor/batch.rs +246 -0
  62. data/vendor/kreuzberg/src/core/extractor/bytes.rs +116 -0
  63. data/vendor/kreuzberg/src/core/extractor/file.rs +240 -0
  64. data/vendor/kreuzberg/src/core/extractor/helpers.rs +71 -0
  65. data/vendor/kreuzberg/src/core/extractor/legacy.rs +62 -0
  66. data/vendor/kreuzberg/src/core/extractor/mod.rs +490 -0
  67. data/vendor/kreuzberg/src/core/extractor/sync.rs +208 -0
  68. data/vendor/kreuzberg/src/core/mod.rs +4 -1
  69. data/vendor/kreuzberg/src/core/pipeline/cache.rs +60 -0
  70. data/vendor/kreuzberg/src/core/pipeline/execution.rs +89 -0
  71. data/vendor/kreuzberg/src/core/pipeline/features.rs +108 -0
  72. data/vendor/kreuzberg/src/core/pipeline/format.rs +392 -0
  73. data/vendor/kreuzberg/src/core/pipeline/initialization.rs +67 -0
  74. data/vendor/kreuzberg/src/core/pipeline/mod.rs +135 -0
  75. data/vendor/kreuzberg/src/core/pipeline/tests.rs +975 -0
  76. data/vendor/kreuzberg/src/core/server_config/env.rs +90 -0
  77. data/vendor/kreuzberg/src/core/server_config/loader.rs +202 -0
  78. data/vendor/kreuzberg/src/core/server_config/mod.rs +380 -0
  79. data/vendor/kreuzberg/src/core/server_config/tests/basic_tests.rs +124 -0
  80. data/vendor/kreuzberg/src/core/server_config/tests/env_tests.rs +216 -0
  81. data/vendor/kreuzberg/src/core/server_config/tests/file_loading_tests.rs +341 -0
  82. data/vendor/kreuzberg/src/core/server_config/tests/mod.rs +5 -0
  83. data/vendor/kreuzberg/src/core/server_config/validation.rs +17 -0
  84. data/vendor/kreuzberg/src/embeddings.rs +136 -13
  85. data/vendor/kreuzberg/src/extraction/{archive.rs → archive/mod.rs} +45 -239
  86. data/vendor/kreuzberg/src/extraction/archive/sevenz.rs +98 -0
  87. data/vendor/kreuzberg/src/extraction/archive/tar.rs +118 -0
  88. data/vendor/kreuzberg/src/extraction/archive/zip.rs +101 -0
  89. data/vendor/kreuzberg/src/extraction/html/converter.rs +592 -0
  90. data/vendor/kreuzberg/src/extraction/html/image_handling.rs +95 -0
  91. data/vendor/kreuzberg/src/extraction/html/mod.rs +53 -0
  92. data/vendor/kreuzberg/src/extraction/html/processor.rs +659 -0
  93. data/vendor/kreuzberg/src/extraction/html/stack_management.rs +103 -0
  94. data/vendor/kreuzberg/src/extraction/html/types.rs +28 -0
  95. data/vendor/kreuzberg/src/extraction/mod.rs +6 -2
  96. data/vendor/kreuzberg/src/extraction/pptx/container.rs +159 -0
  97. data/vendor/kreuzberg/src/extraction/pptx/content_builder.rs +168 -0
  98. data/vendor/kreuzberg/src/extraction/pptx/elements.rs +132 -0
  99. data/vendor/kreuzberg/src/extraction/pptx/image_handling.rs +57 -0
  100. data/vendor/kreuzberg/src/extraction/pptx/metadata.rs +160 -0
  101. data/vendor/kreuzberg/src/extraction/pptx/mod.rs +558 -0
  102. data/vendor/kreuzberg/src/extraction/pptx/parser.rs +379 -0
  103. data/vendor/kreuzberg/src/extraction/transform/content.rs +205 -0
  104. data/vendor/kreuzberg/src/extraction/transform/elements.rs +211 -0
  105. data/vendor/kreuzberg/src/extraction/transform/mod.rs +480 -0
  106. data/vendor/kreuzberg/src/extraction/transform/types.rs +27 -0
  107. data/vendor/kreuzberg/src/extractors/archive.rs +2 -0
  108. data/vendor/kreuzberg/src/extractors/bibtex.rs +2 -0
  109. data/vendor/kreuzberg/src/extractors/djot_format/attributes.rs +134 -0
  110. data/vendor/kreuzberg/src/extractors/djot_format/conversion.rs +223 -0
  111. data/vendor/kreuzberg/src/extractors/djot_format/extractor.rs +172 -0
  112. data/vendor/kreuzberg/src/extractors/djot_format/mod.rs +24 -0
  113. data/vendor/kreuzberg/src/extractors/djot_format/parsing/block_handlers.rs +271 -0
  114. data/vendor/kreuzberg/src/extractors/djot_format/parsing/content_extraction.rs +257 -0
  115. data/vendor/kreuzberg/src/extractors/djot_format/parsing/event_handlers.rs +101 -0
  116. data/vendor/kreuzberg/src/extractors/djot_format/parsing/inline_handlers.rs +201 -0
  117. data/vendor/kreuzberg/src/extractors/djot_format/parsing/mod.rs +16 -0
  118. data/vendor/kreuzberg/src/extractors/djot_format/parsing/state.rs +78 -0
  119. data/vendor/kreuzberg/src/extractors/djot_format/parsing/table_extraction.rs +68 -0
  120. data/vendor/kreuzberg/src/extractors/djot_format/parsing/text_extraction.rs +61 -0
  121. data/vendor/kreuzberg/src/extractors/djot_format/rendering.rs +452 -0
  122. data/vendor/kreuzberg/src/extractors/docbook.rs +2 -0
  123. data/vendor/kreuzberg/src/extractors/docx.rs +12 -1
  124. data/vendor/kreuzberg/src/extractors/email.rs +2 -0
  125. data/vendor/kreuzberg/src/extractors/epub/content.rs +333 -0
  126. data/vendor/kreuzberg/src/extractors/epub/metadata.rs +137 -0
  127. data/vendor/kreuzberg/src/extractors/epub/mod.rs +186 -0
  128. data/vendor/kreuzberg/src/extractors/epub/parsing.rs +86 -0
  129. data/vendor/kreuzberg/src/extractors/excel.rs +4 -0
  130. data/vendor/kreuzberg/src/extractors/fictionbook.rs +2 -0
  131. data/vendor/kreuzberg/src/extractors/frontmatter_utils.rs +466 -0
  132. data/vendor/kreuzberg/src/extractors/html.rs +80 -8
  133. data/vendor/kreuzberg/src/extractors/image.rs +8 -1
  134. data/vendor/kreuzberg/src/extractors/jats/elements.rs +350 -0
  135. data/vendor/kreuzberg/src/extractors/jats/metadata.rs +21 -0
  136. data/vendor/kreuzberg/src/extractors/{jats.rs → jats/mod.rs} +10 -412
  137. data/vendor/kreuzberg/src/extractors/jats/parser.rs +52 -0
  138. data/vendor/kreuzberg/src/extractors/jupyter.rs +2 -0
  139. data/vendor/kreuzberg/src/extractors/latex/commands.rs +93 -0
  140. data/vendor/kreuzberg/src/extractors/latex/environments.rs +157 -0
  141. data/vendor/kreuzberg/src/extractors/latex/metadata.rs +27 -0
  142. data/vendor/kreuzberg/src/extractors/latex/mod.rs +146 -0
  143. data/vendor/kreuzberg/src/extractors/latex/parser.rs +231 -0
  144. data/vendor/kreuzberg/src/extractors/latex/utilities.rs +126 -0
  145. data/vendor/kreuzberg/src/extractors/markdown.rs +39 -162
  146. data/vendor/kreuzberg/src/extractors/mod.rs +9 -1
  147. data/vendor/kreuzberg/src/extractors/odt.rs +2 -0
  148. data/vendor/kreuzberg/src/extractors/opml/core.rs +165 -0
  149. data/vendor/kreuzberg/src/extractors/opml/mod.rs +31 -0
  150. data/vendor/kreuzberg/src/extractors/opml/parser.rs +479 -0
  151. data/vendor/kreuzberg/src/extractors/orgmode.rs +2 -0
  152. data/vendor/kreuzberg/src/extractors/pdf/extraction.rs +106 -0
  153. data/vendor/kreuzberg/src/extractors/{pdf.rs → pdf/mod.rs} +25 -324
  154. data/vendor/kreuzberg/src/extractors/pdf/ocr.rs +214 -0
  155. data/vendor/kreuzberg/src/extractors/pdf/pages.rs +51 -0
  156. data/vendor/kreuzberg/src/extractors/pptx.rs +9 -2
  157. data/vendor/kreuzberg/src/extractors/rst.rs +2 -0
  158. data/vendor/kreuzberg/src/extractors/rtf/encoding.rs +116 -0
  159. data/vendor/kreuzberg/src/extractors/rtf/formatting.rs +24 -0
  160. data/vendor/kreuzberg/src/extractors/rtf/images.rs +72 -0
  161. data/vendor/kreuzberg/src/extractors/rtf/metadata.rs +216 -0
  162. data/vendor/kreuzberg/src/extractors/rtf/mod.rs +142 -0
  163. data/vendor/kreuzberg/src/extractors/rtf/parser.rs +259 -0
  164. data/vendor/kreuzberg/src/extractors/rtf/tables.rs +83 -0
  165. data/vendor/kreuzberg/src/extractors/structured.rs +2 -0
  166. data/vendor/kreuzberg/src/extractors/text.rs +4 -0
  167. data/vendor/kreuzberg/src/extractors/typst.rs +2 -0
  168. data/vendor/kreuzberg/src/extractors/xml.rs +2 -0
  169. data/vendor/kreuzberg/src/keywords/processor.rs +14 -0
  170. data/vendor/kreuzberg/src/language_detection/processor.rs +10 -0
  171. data/vendor/kreuzberg/src/lib.rs +2 -2
  172. data/vendor/kreuzberg/src/mcp/errors.rs +312 -0
  173. data/vendor/kreuzberg/src/mcp/format.rs +211 -0
  174. data/vendor/kreuzberg/src/mcp/mod.rs +9 -3
  175. data/vendor/kreuzberg/src/mcp/params.rs +196 -0
  176. data/vendor/kreuzberg/src/mcp/server.rs +39 -1438
  177. data/vendor/kreuzberg/src/mcp/tools/cache.rs +179 -0
  178. data/vendor/kreuzberg/src/mcp/tools/extraction.rs +403 -0
  179. data/vendor/kreuzberg/src/mcp/tools/mime.rs +150 -0
  180. data/vendor/kreuzberg/src/mcp/tools/mod.rs +11 -0
  181. data/vendor/kreuzberg/src/ocr/backends/easyocr.rs +96 -0
  182. data/vendor/kreuzberg/src/ocr/backends/mod.rs +7 -0
  183. data/vendor/kreuzberg/src/ocr/backends/paddleocr.rs +27 -0
  184. data/vendor/kreuzberg/src/ocr/backends/tesseract.rs +134 -0
  185. data/vendor/kreuzberg/src/ocr/hocr.rs +60 -16
  186. data/vendor/kreuzberg/src/ocr/language_registry.rs +11 -235
  187. data/vendor/kreuzberg/src/ocr/mod.rs +1 -0
  188. data/vendor/kreuzberg/src/ocr/processor/config.rs +203 -0
  189. data/vendor/kreuzberg/src/ocr/processor/execution.rs +494 -0
  190. data/vendor/kreuzberg/src/ocr/processor/mod.rs +265 -0
  191. data/vendor/kreuzberg/src/ocr/processor/validation.rs +145 -0
  192. data/vendor/kreuzberg/src/ocr/tesseract_backend.rs +41 -24
  193. data/vendor/kreuzberg/src/pdf/bindings.rs +21 -8
  194. data/vendor/kreuzberg/src/pdf/hierarchy/bounding_box.rs +289 -0
  195. data/vendor/kreuzberg/src/pdf/hierarchy/clustering.rs +199 -0
  196. data/vendor/kreuzberg/src/pdf/{hierarchy.rs → hierarchy/extraction.rs} +6 -346
  197. data/vendor/kreuzberg/src/pdf/hierarchy/mod.rs +18 -0
  198. data/vendor/kreuzberg/src/plugins/extractor/mod.rs +319 -0
  199. data/vendor/kreuzberg/src/plugins/extractor/registry.rs +434 -0
  200. data/vendor/kreuzberg/src/plugins/extractor/trait.rs +391 -0
  201. data/vendor/kreuzberg/src/plugins/mod.rs +13 -0
  202. data/vendor/kreuzberg/src/plugins/ocr.rs +11 -0
  203. data/vendor/kreuzberg/src/plugins/processor/mod.rs +365 -0
  204. data/vendor/kreuzberg/src/plugins/processor/registry.rs +37 -0
  205. data/vendor/kreuzberg/src/plugins/processor/trait.rs +284 -0
  206. data/vendor/kreuzberg/src/plugins/registry/extractor.rs +416 -0
  207. data/vendor/kreuzberg/src/plugins/registry/mod.rs +116 -0
  208. data/vendor/kreuzberg/src/plugins/registry/ocr.rs +293 -0
  209. data/vendor/kreuzberg/src/plugins/registry/processor.rs +304 -0
  210. data/vendor/kreuzberg/src/plugins/registry/validator.rs +238 -0
  211. data/vendor/kreuzberg/src/plugins/validator/mod.rs +424 -0
  212. data/vendor/kreuzberg/src/plugins/validator/registry.rs +355 -0
  213. data/vendor/kreuzberg/src/plugins/validator/trait.rs +276 -0
  214. data/vendor/kreuzberg/src/stopwords/languages/asian.rs +40 -0
  215. data/vendor/kreuzberg/src/stopwords/languages/germanic.rs +36 -0
  216. data/vendor/kreuzberg/src/stopwords/languages/mod.rs +10 -0
  217. data/vendor/kreuzberg/src/stopwords/languages/other.rs +44 -0
  218. data/vendor/kreuzberg/src/stopwords/languages/romance.rs +36 -0
  219. data/vendor/kreuzberg/src/stopwords/languages/slavic.rs +36 -0
  220. data/vendor/kreuzberg/src/stopwords/mod.rs +7 -33
  221. data/vendor/kreuzberg/src/text/quality.rs +1 -1
  222. data/vendor/kreuzberg/src/text/quality_processor.rs +10 -0
  223. data/vendor/kreuzberg/src/text/token_reduction/core/analysis.rs +238 -0
  224. data/vendor/kreuzberg/src/text/token_reduction/core/mod.rs +8 -0
  225. data/vendor/kreuzberg/src/text/token_reduction/core/punctuation.rs +54 -0
  226. data/vendor/kreuzberg/src/text/token_reduction/core/reducer.rs +384 -0
  227. data/vendor/kreuzberg/src/text/token_reduction/core/sentence_selection.rs +68 -0
  228. data/vendor/kreuzberg/src/text/token_reduction/core/word_filtering.rs +156 -0
  229. data/vendor/kreuzberg/src/text/token_reduction/filters/general.rs +377 -0
  230. data/vendor/kreuzberg/src/text/token_reduction/filters/html.rs +51 -0
  231. data/vendor/kreuzberg/src/text/token_reduction/filters/markdown.rs +285 -0
  232. data/vendor/kreuzberg/src/text/token_reduction/filters.rs +131 -246
  233. data/vendor/kreuzberg/src/types/djot.rs +209 -0
  234. data/vendor/kreuzberg/src/types/extraction.rs +301 -0
  235. data/vendor/kreuzberg/src/types/formats.rs +443 -0
  236. data/vendor/kreuzberg/src/types/metadata.rs +560 -0
  237. data/vendor/kreuzberg/src/types/mod.rs +281 -0
  238. data/vendor/kreuzberg/src/types/page.rs +182 -0
  239. data/vendor/kreuzberg/src/types/serde_helpers.rs +132 -0
  240. data/vendor/kreuzberg/src/types/tables.rs +39 -0
  241. data/vendor/kreuzberg/src/utils/quality/heuristics.rs +58 -0
  242. data/vendor/kreuzberg/src/utils/{quality.rs → quality/mod.rs} +168 -489
  243. data/vendor/kreuzberg/src/utils/quality/patterns.rs +117 -0
  244. data/vendor/kreuzberg/src/utils/quality/scoring.rs +178 -0
  245. data/vendor/kreuzberg/src/utils/string_pool/buffer_pool.rs +325 -0
  246. data/vendor/kreuzberg/src/utils/string_pool/interned.rs +102 -0
  247. data/vendor/kreuzberg/src/utils/string_pool/language_pool.rs +119 -0
  248. data/vendor/kreuzberg/src/utils/string_pool/mime_pool.rs +235 -0
  249. data/vendor/kreuzberg/src/utils/string_pool/mod.rs +41 -0
  250. data/vendor/kreuzberg/tests/api_chunk.rs +313 -0
  251. data/vendor/kreuzberg/tests/api_embed.rs +6 -9
  252. data/vendor/kreuzberg/tests/batch_orchestration.rs +1 -0
  253. data/vendor/kreuzberg/tests/concurrency_stress.rs +7 -0
  254. data/vendor/kreuzberg/tests/core_integration.rs +1 -0
  255. data/vendor/kreuzberg/tests/docx_metadata_extraction_test.rs +130 -0
  256. data/vendor/kreuzberg/tests/epub_native_extractor_tests.rs +5 -14
  257. data/vendor/kreuzberg/tests/format_integration.rs +2 -0
  258. data/vendor/kreuzberg/tests/helpers/mod.rs +1 -0
  259. data/vendor/kreuzberg/tests/html_table_test.rs +11 -11
  260. data/vendor/kreuzberg/tests/ocr_configuration.rs +16 -0
  261. data/vendor/kreuzberg/tests/ocr_errors.rs +18 -0
  262. data/vendor/kreuzberg/tests/ocr_quality.rs +9 -0
  263. data/vendor/kreuzberg/tests/ocr_stress.rs +1 -0
  264. data/vendor/kreuzberg/tests/pipeline_integration.rs +50 -0
  265. data/vendor/kreuzberg/tests/plugin_ocr_backend_test.rs +13 -0
  266. data/vendor/kreuzberg/tests/plugin_system.rs +12 -0
  267. data/vendor/kreuzberg/tests/registry_integration_tests.rs +2 -0
  268. data/vendor/kreuzberg-ffi/Cargo.toml +2 -1
  269. data/vendor/kreuzberg-ffi/benches/result_view_benchmark.rs +2 -0
  270. data/vendor/kreuzberg-ffi/kreuzberg.h +347 -178
  271. data/vendor/kreuzberg-ffi/src/config/html.rs +318 -0
  272. data/vendor/kreuzberg-ffi/src/config/loader.rs +154 -0
  273. data/vendor/kreuzberg-ffi/src/config/merge.rs +104 -0
  274. data/vendor/kreuzberg-ffi/src/config/mod.rs +385 -0
  275. data/vendor/kreuzberg-ffi/src/config/parse.rs +91 -0
  276. data/vendor/kreuzberg-ffi/src/config/serialize.rs +118 -0
  277. data/vendor/kreuzberg-ffi/src/config_builder.rs +598 -0
  278. data/vendor/kreuzberg-ffi/src/error.rs +46 -14
  279. data/vendor/kreuzberg-ffi/src/helpers.rs +10 -0
  280. data/vendor/kreuzberg-ffi/src/html_options.rs +421 -0
  281. data/vendor/kreuzberg-ffi/src/lib.rs +16 -0
  282. data/vendor/kreuzberg-ffi/src/panic_shield.rs +11 -0
  283. data/vendor/kreuzberg-ffi/src/plugins/ocr_backend.rs +2 -0
  284. data/vendor/kreuzberg-ffi/src/result.rs +148 -122
  285. data/vendor/kreuzberg-ffi/src/result_view.rs +4 -0
  286. data/vendor/kreuzberg-tesseract/Cargo.toml +2 -2
  287. metadata +200 -28
  288. data/vendor/kreuzberg/src/api/server.rs +0 -518
  289. data/vendor/kreuzberg/src/core/config.rs +0 -1914
  290. data/vendor/kreuzberg/src/core/config_validation.rs +0 -949
  291. data/vendor/kreuzberg/src/core/extractor.rs +0 -1200
  292. data/vendor/kreuzberg/src/core/pipeline.rs +0 -1223
  293. data/vendor/kreuzberg/src/core/server_config.rs +0 -1220
  294. data/vendor/kreuzberg/src/extraction/html.rs +0 -1830
  295. data/vendor/kreuzberg/src/extraction/pptx.rs +0 -3102
  296. data/vendor/kreuzberg/src/extractors/epub.rs +0 -696
  297. data/vendor/kreuzberg/src/extractors/latex.rs +0 -653
  298. data/vendor/kreuzberg/src/extractors/opml.rs +0 -635
  299. data/vendor/kreuzberg/src/extractors/rtf.rs +0 -809
  300. data/vendor/kreuzberg/src/ocr/processor.rs +0 -858
  301. data/vendor/kreuzberg/src/plugins/extractor.rs +0 -1042
  302. data/vendor/kreuzberg/src/plugins/processor.rs +0 -650
  303. data/vendor/kreuzberg/src/plugins/registry.rs +0 -1339
  304. data/vendor/kreuzberg/src/plugins/validator.rs +0 -967
  305. data/vendor/kreuzberg/src/text/token_reduction/core.rs +0 -832
  306. data/vendor/kreuzberg/src/types.rs +0 -1713
  307. data/vendor/kreuzberg/src/utils/string_pool.rs +0 -762
  308. data/vendor/kreuzberg-ffi/src/config.rs +0 -1341
@@ -0,0 +1,124 @@
1
+ //! Basic tests for ServerConfig functionality.
2
+
3
+ use crate::core::ServerConfig;
4
+
5
+ #[test]
6
+ fn test_default_config() {
7
+ let config = ServerConfig::default();
8
+ assert_eq!(config.host, "127.0.0.1");
9
+ assert_eq!(config.port, 8000);
10
+ assert!(config.cors_origins.is_empty());
11
+ assert_eq!(config.max_request_body_bytes, 104_857_600);
12
+ assert_eq!(config.max_multipart_field_bytes, 104_857_600);
13
+ assert!(config.max_upload_mb.is_none());
14
+ }
15
+
16
+ #[test]
17
+ fn test_listen_addr() {
18
+ let config = ServerConfig::default();
19
+ assert_eq!(config.listen_addr(), "127.0.0.1:8000");
20
+ }
21
+
22
+ #[test]
23
+ fn test_listen_addr_custom() {
24
+ let config = ServerConfig {
25
+ host: "0.0.0.0".to_string(),
26
+ port: 3000,
27
+ ..Default::default()
28
+ };
29
+ assert_eq!(config.listen_addr(), "0.0.0.0:3000");
30
+ }
31
+
32
+ #[test]
33
+ fn test_cors_allows_all() {
34
+ let mut config = ServerConfig::default();
35
+ assert!(config.cors_allows_all());
36
+
37
+ config.cors_origins.push("https://example.com".to_string());
38
+ assert!(!config.cors_allows_all());
39
+ }
40
+
41
+ #[test]
42
+ fn test_is_origin_allowed_all() {
43
+ let config = ServerConfig::default();
44
+ assert!(config.is_origin_allowed("https://example.com"));
45
+ assert!(config.is_origin_allowed("https://other.com"));
46
+ }
47
+
48
+ #[test]
49
+ fn test_is_origin_allowed_specific() {
50
+ let mut config = ServerConfig::default();
51
+ config.cors_origins.push("https://allowed.com".to_string());
52
+
53
+ assert!(config.is_origin_allowed("https://allowed.com"));
54
+ assert!(!config.is_origin_allowed("https://denied.com"));
55
+ }
56
+
57
+ #[test]
58
+ fn test_max_request_body_mb() {
59
+ let config = ServerConfig::default();
60
+ assert_eq!(config.max_request_body_mb(), 100);
61
+ }
62
+
63
+ #[test]
64
+ fn test_max_multipart_field_mb() {
65
+ let config = ServerConfig::default();
66
+ assert_eq!(config.max_multipart_field_mb(), 100);
67
+ }
68
+
69
+ #[test]
70
+ fn test_max_bytes_to_mb_rounding() {
71
+ let mut config = ServerConfig {
72
+ max_request_body_bytes: 1_048_576, // 1 MB
73
+ ..Default::default()
74
+ };
75
+ assert_eq!(config.max_request_body_mb(), 1);
76
+
77
+ config.max_request_body_bytes = 1_048_577; // 1 MB + 1 byte
78
+ assert_eq!(config.max_request_body_mb(), 2); // Rounds up
79
+ }
80
+
81
+ #[test]
82
+ fn test_normalize_legacy_max_upload_mb() {
83
+ let mut config = ServerConfig {
84
+ max_upload_mb: Some(50),
85
+ ..Default::default()
86
+ };
87
+
88
+ config.normalize_legacy_fields();
89
+
90
+ assert_eq!(config.max_multipart_field_bytes, 50 * 1_048_576);
91
+ }
92
+
93
+ #[test]
94
+ fn test_normalize_legacy_max_upload_mb_zero() {
95
+ let mut config = ServerConfig {
96
+ max_upload_mb: Some(0),
97
+ ..Default::default()
98
+ };
99
+
100
+ config.normalize_legacy_fields();
101
+
102
+ assert_eq!(config.max_multipart_field_bytes, 0);
103
+ }
104
+
105
+ #[test]
106
+ fn test_serde_default_serialization() {
107
+ let config = ServerConfig::default();
108
+ let json = serde_json::to_string(&config).unwrap();
109
+
110
+ // Should serialize without the max_upload_mb field when None
111
+ assert!(!json.contains("max_upload_mb"));
112
+ }
113
+
114
+ #[test]
115
+ fn test_serde_with_max_upload_mb_serialization() {
116
+ let config = ServerConfig {
117
+ max_upload_mb: Some(50),
118
+ ..Default::default()
119
+ };
120
+ let json = serde_json::to_string(&config).unwrap();
121
+
122
+ // Should serialize with max_upload_mb when Some
123
+ assert!(json.contains("max_upload_mb"));
124
+ }
@@ -0,0 +1,216 @@
1
+ //! Tests for environment variable overrides.
2
+
3
+ #![allow(unsafe_code)]
4
+
5
+ use crate::core::ServerConfig;
6
+
7
+ #[serial_test::serial]
8
+ #[test]
9
+ fn test_apply_env_host_override() {
10
+ let original = std::env::var("KREUZBERG_HOST").ok();
11
+ unsafe {
12
+ std::env::set_var("KREUZBERG_HOST", "192.168.1.1");
13
+ }
14
+
15
+ let mut config = ServerConfig::default();
16
+ config.apply_env_overrides().unwrap();
17
+
18
+ assert_eq!(config.host, "192.168.1.1");
19
+
20
+ // Cleanup
21
+ unsafe {
22
+ if let Some(orig) = original {
23
+ std::env::set_var("KREUZBERG_HOST", orig);
24
+ } else {
25
+ std::env::remove_var("KREUZBERG_HOST");
26
+ }
27
+ }
28
+ }
29
+
30
+ #[serial_test::serial]
31
+ #[test]
32
+ fn test_apply_env_port_override() {
33
+ let original = std::env::var("KREUZBERG_PORT").ok();
34
+ unsafe {
35
+ std::env::set_var("KREUZBERG_PORT", "5000");
36
+ }
37
+
38
+ let mut config = ServerConfig::default();
39
+ config.apply_env_overrides().unwrap();
40
+
41
+ assert_eq!(config.port, 5000);
42
+
43
+ // Cleanup
44
+ unsafe {
45
+ if let Some(orig) = original {
46
+ std::env::set_var("KREUZBERG_PORT", orig);
47
+ } else {
48
+ std::env::remove_var("KREUZBERG_PORT");
49
+ }
50
+ }
51
+ }
52
+
53
+ #[serial_test::serial]
54
+ #[test]
55
+ fn test_apply_env_port_invalid() {
56
+ let original = std::env::var("KREUZBERG_PORT").ok();
57
+ unsafe {
58
+ std::env::set_var("KREUZBERG_PORT", "not_a_number");
59
+ }
60
+
61
+ let mut config = ServerConfig::default();
62
+ let result = config.apply_env_overrides();
63
+
64
+ assert!(result.is_err());
65
+ assert!(
66
+ result
67
+ .unwrap_err()
68
+ .to_string()
69
+ .contains("KREUZBERG_PORT must be a valid u16")
70
+ );
71
+
72
+ // Cleanup
73
+ unsafe {
74
+ if let Some(orig) = original {
75
+ std::env::set_var("KREUZBERG_PORT", orig);
76
+ } else {
77
+ std::env::remove_var("KREUZBERG_PORT");
78
+ }
79
+ }
80
+ }
81
+
82
+ #[serial_test::serial]
83
+ #[test]
84
+ fn test_apply_env_cors_origins_override() {
85
+ let original = std::env::var("KREUZBERG_CORS_ORIGINS").ok();
86
+ unsafe {
87
+ std::env::set_var("KREUZBERG_CORS_ORIGINS", "https://example.com, https://other.com");
88
+ }
89
+
90
+ let mut config = ServerConfig::default();
91
+ config.apply_env_overrides().unwrap();
92
+
93
+ assert_eq!(config.cors_origins.len(), 2);
94
+ assert!(config.cors_origins.contains(&"https://example.com".to_string()));
95
+ assert!(config.cors_origins.contains(&"https://other.com".to_string()));
96
+
97
+ // Cleanup
98
+ unsafe {
99
+ if let Some(orig) = original {
100
+ std::env::set_var("KREUZBERG_CORS_ORIGINS", orig);
101
+ } else {
102
+ std::env::remove_var("KREUZBERG_CORS_ORIGINS");
103
+ }
104
+ }
105
+ }
106
+
107
+ #[serial_test::serial]
108
+ #[test]
109
+ fn test_apply_env_max_request_body_bytes_override() {
110
+ let original = std::env::var("KREUZBERG_MAX_REQUEST_BODY_BYTES").ok();
111
+ unsafe {
112
+ std::env::set_var("KREUZBERG_MAX_REQUEST_BODY_BYTES", "52428800");
113
+ }
114
+
115
+ let mut config = ServerConfig::default();
116
+ config.apply_env_overrides().unwrap();
117
+
118
+ assert_eq!(config.max_request_body_bytes, 52_428_800);
119
+
120
+ // Cleanup
121
+ unsafe {
122
+ if let Some(orig) = original {
123
+ std::env::set_var("KREUZBERG_MAX_REQUEST_BODY_BYTES", orig);
124
+ } else {
125
+ std::env::remove_var("KREUZBERG_MAX_REQUEST_BODY_BYTES");
126
+ }
127
+ }
128
+ }
129
+
130
+ #[serial_test::serial]
131
+ #[test]
132
+ fn test_apply_env_max_multipart_field_bytes_override() {
133
+ let original = std::env::var("KREUZBERG_MAX_MULTIPART_FIELD_BYTES").ok();
134
+ unsafe {
135
+ std::env::set_var("KREUZBERG_MAX_MULTIPART_FIELD_BYTES", "78643200");
136
+ }
137
+
138
+ let mut config = ServerConfig::default();
139
+ config.apply_env_overrides().unwrap();
140
+
141
+ assert_eq!(config.max_multipart_field_bytes, 78_643_200);
142
+
143
+ // Cleanup
144
+ unsafe {
145
+ if let Some(orig) = original {
146
+ std::env::set_var("KREUZBERG_MAX_MULTIPART_FIELD_BYTES", orig);
147
+ } else {
148
+ std::env::remove_var("KREUZBERG_MAX_MULTIPART_FIELD_BYTES");
149
+ }
150
+ }
151
+ }
152
+
153
+ #[serial_test::serial]
154
+ #[test]
155
+ fn test_apply_env_legacy_max_upload_size_mb_override() {
156
+ let original = std::env::var("KREUZBERG_MAX_UPLOAD_SIZE_MB").ok();
157
+ unsafe {
158
+ std::env::set_var("KREUZBERG_MAX_UPLOAD_SIZE_MB", "75");
159
+ }
160
+
161
+ let mut config = ServerConfig::default();
162
+ config.apply_env_overrides().unwrap();
163
+
164
+ assert_eq!(config.max_upload_mb, Some(75));
165
+ assert_eq!(config.max_multipart_field_bytes, 75 * 1_048_576);
166
+
167
+ // Cleanup
168
+ unsafe {
169
+ if let Some(orig) = original {
170
+ std::env::set_var("KREUZBERG_MAX_UPLOAD_SIZE_MB", orig);
171
+ } else {
172
+ std::env::remove_var("KREUZBERG_MAX_UPLOAD_SIZE_MB");
173
+ }
174
+ }
175
+ }
176
+
177
+ #[serial_test::serial]
178
+ #[test]
179
+ fn test_apply_env_multiple_overrides() {
180
+ let host_orig = std::env::var("KREUZBERG_HOST").ok();
181
+ let port_orig = std::env::var("KREUZBERG_PORT").ok();
182
+ let cors_orig = std::env::var("KREUZBERG_CORS_ORIGINS").ok();
183
+
184
+ unsafe {
185
+ std::env::set_var("KREUZBERG_HOST", "0.0.0.0");
186
+ std::env::set_var("KREUZBERG_PORT", "4000");
187
+ std::env::set_var("KREUZBERG_CORS_ORIGINS", "https://api.example.com");
188
+ }
189
+
190
+ let mut config = ServerConfig::default();
191
+ config.apply_env_overrides().unwrap();
192
+
193
+ assert_eq!(config.host, "0.0.0.0");
194
+ assert_eq!(config.port, 4000);
195
+ assert_eq!(config.cors_origins.len(), 1);
196
+ assert_eq!(config.cors_origins[0], "https://api.example.com");
197
+
198
+ // Cleanup
199
+ unsafe {
200
+ if let Some(orig) = host_orig {
201
+ std::env::set_var("KREUZBERG_HOST", orig);
202
+ } else {
203
+ std::env::remove_var("KREUZBERG_HOST");
204
+ }
205
+ if let Some(orig) = port_orig {
206
+ std::env::set_var("KREUZBERG_PORT", orig);
207
+ } else {
208
+ std::env::remove_var("KREUZBERG_PORT");
209
+ }
210
+ if let Some(orig) = cors_orig {
211
+ std::env::set_var("KREUZBERG_CORS_ORIGINS", orig);
212
+ } else {
213
+ std::env::remove_var("KREUZBERG_CORS_ORIGINS");
214
+ }
215
+ }
216
+ }
@@ -0,0 +1,341 @@
1
+ //! Tests for file loading functionality.
2
+
3
+ use crate::core::ServerConfig;
4
+ use std::fs;
5
+ use tempfile::tempdir;
6
+
7
+ #[test]
8
+ fn test_from_toml_file() {
9
+ let dir = tempdir().unwrap();
10
+ let config_path = dir.path().join("server.toml");
11
+
12
+ fs::write(
13
+ &config_path,
14
+ r#"
15
+ host = "0.0.0.0"
16
+ port = 3000
17
+ cors_origins = ["https://example.com", "https://other.com"]
18
+ max_request_body_bytes = 50000000
19
+ max_multipart_field_bytes = 75000000
20
+ "#,
21
+ )
22
+ .unwrap();
23
+
24
+ let config = ServerConfig::from_toml_file(&config_path).unwrap();
25
+ assert_eq!(config.host, "0.0.0.0");
26
+ assert_eq!(config.port, 3000);
27
+ assert_eq!(config.cors_origins.len(), 2);
28
+ assert_eq!(config.max_request_body_bytes, 50_000_000);
29
+ assert_eq!(config.max_multipart_field_bytes, 75_000_000);
30
+ }
31
+
32
+ #[test]
33
+ fn test_from_yaml_file() {
34
+ let dir = tempdir().unwrap();
35
+ let config_path = dir.path().join("server.yaml");
36
+
37
+ fs::write(
38
+ &config_path,
39
+ r#"
40
+ host: 0.0.0.0
41
+ port: 3000
42
+ cors_origins:
43
+ - https://example.com
44
+ - https://other.com
45
+ max_request_body_bytes: 50000000
46
+ max_multipart_field_bytes: 75000000
47
+ "#,
48
+ )
49
+ .unwrap();
50
+
51
+ let config = ServerConfig::from_yaml_file(&config_path).unwrap();
52
+ assert_eq!(config.host, "0.0.0.0");
53
+ assert_eq!(config.port, 3000);
54
+ assert_eq!(config.cors_origins.len(), 2);
55
+ assert_eq!(config.max_request_body_bytes, 50_000_000);
56
+ assert_eq!(config.max_multipart_field_bytes, 75_000_000);
57
+ }
58
+
59
+ #[test]
60
+ fn test_from_json_file() {
61
+ let dir = tempdir().unwrap();
62
+ let config_path = dir.path().join("server.json");
63
+
64
+ fs::write(
65
+ &config_path,
66
+ r#"{
67
+ "host": "0.0.0.0",
68
+ "port": 3000,
69
+ "cors_origins": ["https://example.com", "https://other.com"],
70
+ "max_request_body_bytes": 50000000,
71
+ "max_multipart_field_bytes": 75000000
72
+ }
73
+ "#,
74
+ )
75
+ .unwrap();
76
+
77
+ let config = ServerConfig::from_json_file(&config_path).unwrap();
78
+ assert_eq!(config.host, "0.0.0.0");
79
+ assert_eq!(config.port, 3000);
80
+ assert_eq!(config.cors_origins.len(), 2);
81
+ assert_eq!(config.max_request_body_bytes, 50_000_000);
82
+ assert_eq!(config.max_multipart_field_bytes, 75_000_000);
83
+ }
84
+
85
+ #[test]
86
+ fn test_from_file_auto_detects_toml() {
87
+ let dir = tempdir().unwrap();
88
+ let config_path = dir.path().join("server.toml");
89
+
90
+ fs::write(
91
+ &config_path,
92
+ r#"
93
+ host = "0.0.0.0"
94
+ port = 3000
95
+ "#,
96
+ )
97
+ .unwrap();
98
+
99
+ let config = ServerConfig::from_file(&config_path).unwrap();
100
+ assert_eq!(config.host, "0.0.0.0");
101
+ assert_eq!(config.port, 3000);
102
+ }
103
+
104
+ #[test]
105
+ fn test_from_file_auto_detects_yaml() {
106
+ let dir = tempdir().unwrap();
107
+ let config_path = dir.path().join("server.yaml");
108
+
109
+ fs::write(
110
+ &config_path,
111
+ r#"
112
+ host: 0.0.0.0
113
+ port: 3000
114
+ "#,
115
+ )
116
+ .unwrap();
117
+
118
+ let config = ServerConfig::from_file(&config_path).unwrap();
119
+ assert_eq!(config.host, "0.0.0.0");
120
+ assert_eq!(config.port, 3000);
121
+ }
122
+
123
+ #[test]
124
+ fn test_from_file_auto_detects_json() {
125
+ let dir = tempdir().unwrap();
126
+ let config_path = dir.path().join("server.json");
127
+
128
+ fs::write(&config_path, r#"{"host": "0.0.0.0", "port": 3000}"#).unwrap();
129
+
130
+ let config = ServerConfig::from_file(&config_path).unwrap();
131
+ assert_eq!(config.host, "0.0.0.0");
132
+ assert_eq!(config.port, 3000);
133
+ }
134
+
135
+ #[test]
136
+ fn test_from_file_unsupported_extension() {
137
+ let dir = tempdir().unwrap();
138
+ let config_path = dir.path().join("server.txt");
139
+
140
+ fs::write(&config_path, "host = 0.0.0.0").unwrap();
141
+
142
+ let result = ServerConfig::from_file(&config_path);
143
+ assert!(result.is_err());
144
+ assert!(
145
+ result
146
+ .unwrap_err()
147
+ .to_string()
148
+ .contains("Unsupported config file format")
149
+ );
150
+ }
151
+
152
+ #[test]
153
+ fn test_from_file_no_extension() {
154
+ let dir = tempdir().unwrap();
155
+ let config_path = dir.path().join("server");
156
+
157
+ fs::write(&config_path, "host = 0.0.0.0").unwrap();
158
+
159
+ let result = ServerConfig::from_file(&config_path);
160
+ assert!(result.is_err());
161
+ assert!(result.unwrap_err().to_string().contains("no extension found"));
162
+ }
163
+
164
+ #[test]
165
+ fn test_legacy_max_upload_mb_in_file() {
166
+ let dir = tempdir().unwrap();
167
+ let config_path = dir.path().join("server.toml");
168
+
169
+ fs::write(
170
+ &config_path,
171
+ r#"
172
+ host = "127.0.0.1"
173
+ port = 8000
174
+ max_upload_mb = 50
175
+ "#,
176
+ )
177
+ .unwrap();
178
+
179
+ let config = ServerConfig::from_toml_file(&config_path).unwrap();
180
+ assert_eq!(config.max_upload_mb, Some(50));
181
+ assert_eq!(config.max_multipart_field_bytes, 50 * 1_048_576);
182
+ }
183
+
184
+ #[test]
185
+ fn test_cors_origins_empty_in_toml() {
186
+ let dir = tempdir().unwrap();
187
+ let config_path = dir.path().join("server.toml");
188
+
189
+ fs::write(
190
+ &config_path,
191
+ r#"
192
+ host = "127.0.0.1"
193
+ port = 8000
194
+ "#,
195
+ )
196
+ .unwrap();
197
+
198
+ let config = ServerConfig::from_toml_file(&config_path).unwrap();
199
+ assert!(config.cors_origins.is_empty());
200
+ assert!(config.cors_allows_all());
201
+ }
202
+
203
+ #[test]
204
+ fn test_full_configuration_toml() {
205
+ let dir = tempdir().unwrap();
206
+ let config_path = dir.path().join("server.toml");
207
+
208
+ fs::write(
209
+ &config_path,
210
+ r#"
211
+ host = "192.168.1.100"
212
+ port = 9000
213
+ cors_origins = ["https://app1.com", "https://app2.com", "https://app3.com"]
214
+ max_request_body_bytes = 200000000
215
+ max_multipart_field_bytes = 150000000
216
+ "#,
217
+ )
218
+ .unwrap();
219
+
220
+ let config = ServerConfig::from_toml_file(&config_path).unwrap();
221
+ assert_eq!(config.host, "192.168.1.100");
222
+ assert_eq!(config.port, 9000);
223
+ assert_eq!(config.listen_addr(), "192.168.1.100:9000");
224
+ assert_eq!(config.cors_origins.len(), 3);
225
+ assert!(!config.cors_allows_all());
226
+ assert!(config.is_origin_allowed("https://app1.com"));
227
+ assert!(!config.is_origin_allowed("https://app4.com"));
228
+ assert_eq!(config.max_request_body_bytes, 200_000_000);
229
+ assert_eq!(config.max_multipart_field_bytes, 150_000_000);
230
+ assert_eq!(config.max_request_body_mb(), 191);
231
+ assert_eq!(config.max_multipart_field_mb(), 144);
232
+ }
233
+
234
+ #[test]
235
+ fn test_from_file_with_nested_server_section_toml() {
236
+ let dir = tempdir().unwrap();
237
+ let config_path = dir.path().join("kreuzberg.toml");
238
+
239
+ // Config file with [server] section and other sections (like ExtractionConfig)
240
+ fs::write(
241
+ &config_path,
242
+ r#"
243
+ [server]
244
+ host = "0.0.0.0"
245
+ port = 3000
246
+ cors_origins = ["https://example.com"]
247
+
248
+ [ocr]
249
+ backend = "tesseract"
250
+ language = "eng"
251
+
252
+ [extraction]
253
+ enabled = true
254
+ "#,
255
+ )
256
+ .unwrap();
257
+
258
+ let config = ServerConfig::from_file(&config_path).unwrap();
259
+ assert_eq!(config.host, "0.0.0.0");
260
+ assert_eq!(config.port, 3000);
261
+ assert_eq!(config.cors_origins.len(), 1);
262
+ assert_eq!(config.cors_origins[0], "https://example.com");
263
+ }
264
+
265
+ #[test]
266
+ fn test_from_file_with_nested_server_section_yaml() {
267
+ let dir = tempdir().unwrap();
268
+ let config_path = dir.path().join("kreuzberg.yaml");
269
+
270
+ // Config file with server: section and other sections
271
+ fs::write(
272
+ &config_path,
273
+ r#"
274
+ server:
275
+ host: 0.0.0.0
276
+ port: 4000
277
+ cors_origins:
278
+ - https://example.com
279
+
280
+ ocr:
281
+ backend: tesseract
282
+ language: eng
283
+ "#,
284
+ )
285
+ .unwrap();
286
+
287
+ let config = ServerConfig::from_file(&config_path).unwrap();
288
+ assert_eq!(config.host, "0.0.0.0");
289
+ assert_eq!(config.port, 4000);
290
+ assert_eq!(config.cors_origins.len(), 1);
291
+ }
292
+
293
+ #[test]
294
+ fn test_from_file_with_nested_server_section_json() {
295
+ let dir = tempdir().unwrap();
296
+ let config_path = dir.path().join("kreuzberg.json");
297
+
298
+ // Config file with "server" key and other sections
299
+ fs::write(
300
+ &config_path,
301
+ r#"
302
+ {
303
+ "server": {
304
+ "host": "0.0.0.0",
305
+ "port": 5000,
306
+ "cors_origins": ["https://example.com"]
307
+ },
308
+ "ocr": {
309
+ "backend": "tesseract",
310
+ "language": "eng"
311
+ }
312
+ }
313
+ "#,
314
+ )
315
+ .unwrap();
316
+
317
+ let config = ServerConfig::from_file(&config_path).unwrap();
318
+ assert_eq!(config.host, "0.0.0.0");
319
+ assert_eq!(config.port, 5000);
320
+ assert_eq!(config.cors_origins.len(), 1);
321
+ }
322
+
323
+ #[test]
324
+ fn test_from_file_flat_format_still_works() {
325
+ let dir = tempdir().unwrap();
326
+ let config_path = dir.path().join("server.toml");
327
+
328
+ // Old flat format without [server] section
329
+ fs::write(
330
+ &config_path,
331
+ r#"
332
+ host = "192.168.1.1"
333
+ port = 6000
334
+ "#,
335
+ )
336
+ .unwrap();
337
+
338
+ let config = ServerConfig::from_file(&config_path).unwrap();
339
+ assert_eq!(config.host, "192.168.1.1");
340
+ assert_eq!(config.port, 6000);
341
+ }
@@ -0,0 +1,5 @@
1
+ //! Tests for server configuration module.
2
+
3
+ mod basic_tests;
4
+ mod env_tests;
5
+ mod file_loading_tests;
@@ -0,0 +1,17 @@
1
+ //! Validation and normalization for server configuration.
2
+ //!
3
+ //! This module provides functionality to validate and normalize server configuration
4
+ //! values, including legacy field migration.
5
+
6
+ /// Normalize legacy field values for backward compatibility.
7
+ ///
8
+ /// If `max_upload_mb` is set, it will be converted to bytes and used to
9
+ /// override `max_multipart_field_bytes`. This allows old configurations
10
+ /// using the legacy field to continue working.
11
+ pub fn normalize_legacy_fields(max_upload_mb: Option<usize>, max_multipart_field_bytes: &mut usize) {
12
+ if let Some(max_upload_mb_value) = max_upload_mb {
13
+ // Convert MB to bytes
14
+ let max_bytes = max_upload_mb_value.saturating_mul(1_048_576);
15
+ *max_multipart_field_bytes = max_bytes;
16
+ }
17
+ }