kreuzberg 4.0.0.pre.rc.8 → 4.0.0.pre.rc.13
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.
- checksums.yaml +4 -4
- data/.gitignore +14 -14
- data/.rspec +3 -3
- data/.rubocop.yaml +1 -1
- data/.rubocop.yml +538 -538
- data/Gemfile +8 -8
- data/Gemfile.lock +4 -104
- data/README.md +454 -432
- data/Rakefile +25 -25
- data/Steepfile +47 -47
- data/examples/async_patterns.rb +341 -341
- data/ext/kreuzberg_rb/extconf.rb +45 -45
- data/ext/kreuzberg_rb/native/.cargo/config.toml +2 -2
- data/ext/kreuzberg_rb/native/Cargo.lock +6941 -6721
- data/ext/kreuzberg_rb/native/Cargo.toml +54 -54
- data/ext/kreuzberg_rb/native/README.md +425 -425
- data/ext/kreuzberg_rb/native/build.rs +15 -15
- data/ext/kreuzberg_rb/native/include/ieeefp.h +11 -11
- data/ext/kreuzberg_rb/native/include/msvc_compat/strings.h +14 -14
- data/ext/kreuzberg_rb/native/include/strings.h +20 -20
- data/ext/kreuzberg_rb/native/include/unistd.h +47 -47
- data/ext/kreuzberg_rb/native/src/lib.rs +3158 -3135
- data/extconf.rb +28 -28
- data/kreuzberg.gemspec +214 -182
- data/lib/kreuzberg/api_proxy.rb +142 -142
- data/lib/kreuzberg/cache_api.rb +81 -46
- data/lib/kreuzberg/cli.rb +55 -55
- data/lib/kreuzberg/cli_proxy.rb +127 -127
- data/lib/kreuzberg/config.rb +724 -724
- data/lib/kreuzberg/error_context.rb +80 -32
- data/lib/kreuzberg/errors.rb +118 -118
- data/lib/kreuzberg/extraction_api.rb +340 -85
- data/lib/kreuzberg/mcp_proxy.rb +186 -186
- data/lib/kreuzberg/ocr_backend_protocol.rb +113 -113
- data/lib/kreuzberg/post_processor_protocol.rb +86 -86
- data/lib/kreuzberg/result.rb +279 -279
- data/lib/kreuzberg/setup_lib_path.rb +80 -80
- data/lib/kreuzberg/validator_protocol.rb +89 -89
- data/lib/kreuzberg/version.rb +5 -5
- data/lib/kreuzberg.rb +109 -103
- data/lib/pdfium.dll +0 -0
- data/sig/kreuzberg/internal.rbs +184 -184
- data/sig/kreuzberg.rbs +546 -537
- data/spec/binding/cache_spec.rb +227 -227
- data/spec/binding/cli_proxy_spec.rb +85 -85
- data/spec/binding/cli_spec.rb +55 -55
- data/spec/binding/config_spec.rb +345 -345
- data/spec/binding/config_validation_spec.rb +283 -283
- data/spec/binding/error_handling_spec.rb +213 -213
- data/spec/binding/errors_spec.rb +66 -66
- data/spec/binding/plugins/ocr_backend_spec.rb +307 -307
- data/spec/binding/plugins/postprocessor_spec.rb +269 -269
- data/spec/binding/plugins/validator_spec.rb +274 -274
- data/spec/fixtures/config.toml +39 -39
- data/spec/fixtures/config.yaml +41 -41
- data/spec/fixtures/invalid_config.toml +4 -4
- data/spec/smoke/package_spec.rb +178 -178
- data/spec/spec_helper.rb +42 -42
- data/vendor/Cargo.toml +45 -0
- data/vendor/kreuzberg/Cargo.toml +61 -38
- data/vendor/kreuzberg/README.md +230 -221
- data/vendor/kreuzberg/benches/otel_overhead.rs +48 -48
- data/vendor/kreuzberg/build.rs +843 -891
- data/vendor/kreuzberg/src/api/error.rs +81 -81
- data/vendor/kreuzberg/src/api/handlers.rs +199 -199
- data/vendor/kreuzberg/src/api/mod.rs +79 -79
- data/vendor/kreuzberg/src/api/server.rs +353 -353
- data/vendor/kreuzberg/src/api/types.rs +170 -170
- data/vendor/kreuzberg/src/cache/mod.rs +1167 -1167
- data/vendor/kreuzberg/src/chunking/mod.rs +1877 -1877
- data/vendor/kreuzberg/src/chunking/processor.rs +220 -220
- data/vendor/kreuzberg/src/core/batch_mode.rs +95 -95
- data/vendor/kreuzberg/src/core/config.rs +1080 -1080
- data/vendor/kreuzberg/src/core/extractor.rs +1156 -1156
- data/vendor/kreuzberg/src/core/io.rs +329 -329
- data/vendor/kreuzberg/src/core/mime.rs +605 -605
- data/vendor/kreuzberg/src/core/mod.rs +47 -47
- data/vendor/kreuzberg/src/core/pipeline.rs +1184 -1171
- data/vendor/kreuzberg/src/embeddings.rs +500 -432
- data/vendor/kreuzberg/src/error.rs +431 -431
- data/vendor/kreuzberg/src/extraction/archive.rs +954 -954
- data/vendor/kreuzberg/src/extraction/docx.rs +398 -398
- data/vendor/kreuzberg/src/extraction/email.rs +854 -854
- data/vendor/kreuzberg/src/extraction/excel.rs +688 -688
- data/vendor/kreuzberg/src/extraction/html.rs +601 -569
- data/vendor/kreuzberg/src/extraction/image.rs +491 -491
- data/vendor/kreuzberg/src/extraction/libreoffice.rs +574 -562
- data/vendor/kreuzberg/src/extraction/markdown.rs +213 -213
- data/vendor/kreuzberg/src/extraction/mod.rs +81 -81
- data/vendor/kreuzberg/src/extraction/office_metadata/app_properties.rs +398 -398
- data/vendor/kreuzberg/src/extraction/office_metadata/core_properties.rs +247 -247
- data/vendor/kreuzberg/src/extraction/office_metadata/custom_properties.rs +240 -240
- data/vendor/kreuzberg/src/extraction/office_metadata/mod.rs +130 -130
- data/vendor/kreuzberg/src/extraction/office_metadata/odt_properties.rs +284 -284
- data/vendor/kreuzberg/src/extraction/pptx.rs +3100 -3100
- data/vendor/kreuzberg/src/extraction/structured.rs +490 -490
- data/vendor/kreuzberg/src/extraction/table.rs +328 -328
- data/vendor/kreuzberg/src/extraction/text.rs +269 -269
- data/vendor/kreuzberg/src/extraction/xml.rs +333 -333
- data/vendor/kreuzberg/src/extractors/archive.rs +447 -447
- data/vendor/kreuzberg/src/extractors/bibtex.rs +470 -470
- data/vendor/kreuzberg/src/extractors/docbook.rs +504 -504
- data/vendor/kreuzberg/src/extractors/docx.rs +400 -400
- data/vendor/kreuzberg/src/extractors/email.rs +157 -157
- data/vendor/kreuzberg/src/extractors/epub.rs +708 -708
- data/vendor/kreuzberg/src/extractors/excel.rs +345 -345
- data/vendor/kreuzberg/src/extractors/fictionbook.rs +492 -492
- data/vendor/kreuzberg/src/extractors/html.rs +407 -407
- data/vendor/kreuzberg/src/extractors/image.rs +219 -219
- data/vendor/kreuzberg/src/extractors/jats.rs +1054 -1054
- data/vendor/kreuzberg/src/extractors/jupyter.rs +368 -368
- data/vendor/kreuzberg/src/extractors/latex.rs +653 -653
- data/vendor/kreuzberg/src/extractors/markdown.rs +701 -701
- data/vendor/kreuzberg/src/extractors/mod.rs +429 -429
- data/vendor/kreuzberg/src/extractors/odt.rs +628 -628
- data/vendor/kreuzberg/src/extractors/opml.rs +635 -635
- data/vendor/kreuzberg/src/extractors/orgmode.rs +529 -529
- data/vendor/kreuzberg/src/extractors/pdf.rs +749 -673
- data/vendor/kreuzberg/src/extractors/pptx.rs +267 -267
- data/vendor/kreuzberg/src/extractors/rst.rs +577 -577
- data/vendor/kreuzberg/src/extractors/rtf.rs +809 -809
- data/vendor/kreuzberg/src/extractors/security.rs +484 -484
- data/vendor/kreuzberg/src/extractors/security_tests.rs +367 -367
- data/vendor/kreuzberg/src/extractors/structured.rs +142 -142
- data/vendor/kreuzberg/src/extractors/text.rs +265 -265
- data/vendor/kreuzberg/src/extractors/typst.rs +651 -651
- data/vendor/kreuzberg/src/extractors/xml.rs +147 -147
- data/vendor/kreuzberg/src/image/dpi.rs +164 -164
- data/vendor/kreuzberg/src/image/mod.rs +6 -6
- data/vendor/kreuzberg/src/image/preprocessing.rs +417 -417
- data/vendor/kreuzberg/src/image/resize.rs +89 -89
- data/vendor/kreuzberg/src/keywords/config.rs +154 -154
- data/vendor/kreuzberg/src/keywords/mod.rs +237 -237
- data/vendor/kreuzberg/src/keywords/processor.rs +275 -275
- data/vendor/kreuzberg/src/keywords/rake.rs +293 -293
- data/vendor/kreuzberg/src/keywords/types.rs +68 -68
- data/vendor/kreuzberg/src/keywords/yake.rs +163 -163
- data/vendor/kreuzberg/src/language_detection/mod.rs +985 -985
- data/vendor/kreuzberg/src/language_detection/processor.rs +219 -219
- data/vendor/kreuzberg/src/lib.rs +113 -113
- data/vendor/kreuzberg/src/mcp/mod.rs +35 -35
- data/vendor/kreuzberg/src/mcp/server.rs +2076 -2076
- data/vendor/kreuzberg/src/ocr/cache.rs +469 -469
- data/vendor/kreuzberg/src/ocr/error.rs +37 -37
- data/vendor/kreuzberg/src/ocr/hocr.rs +216 -216
- data/vendor/kreuzberg/src/ocr/mod.rs +58 -58
- data/vendor/kreuzberg/src/ocr/processor.rs +863 -863
- data/vendor/kreuzberg/src/ocr/table/mod.rs +4 -4
- data/vendor/kreuzberg/src/ocr/table/tsv_parser.rs +144 -144
- data/vendor/kreuzberg/src/ocr/tesseract_backend.rs +452 -452
- data/vendor/kreuzberg/src/ocr/types.rs +393 -393
- data/vendor/kreuzberg/src/ocr/utils.rs +47 -47
- data/vendor/kreuzberg/src/ocr/validation.rs +206 -206
- data/vendor/kreuzberg/src/panic_context.rs +154 -154
- data/vendor/kreuzberg/src/pdf/bindings.rs +44 -0
- data/vendor/kreuzberg/src/pdf/bundled.rs +346 -328
- data/vendor/kreuzberg/src/pdf/error.rs +130 -130
- data/vendor/kreuzberg/src/pdf/images.rs +139 -139
- data/vendor/kreuzberg/src/pdf/metadata.rs +489 -489
- data/vendor/kreuzberg/src/pdf/mod.rs +68 -66
- data/vendor/kreuzberg/src/pdf/rendering.rs +368 -368
- data/vendor/kreuzberg/src/pdf/table.rs +420 -417
- data/vendor/kreuzberg/src/pdf/text.rs +240 -240
- data/vendor/kreuzberg/src/plugins/extractor.rs +1044 -1044
- data/vendor/kreuzberg/src/plugins/mod.rs +212 -212
- data/vendor/kreuzberg/src/plugins/ocr.rs +639 -639
- data/vendor/kreuzberg/src/plugins/processor.rs +650 -650
- data/vendor/kreuzberg/src/plugins/registry.rs +1339 -1339
- data/vendor/kreuzberg/src/plugins/traits.rs +258 -258
- data/vendor/kreuzberg/src/plugins/validator.rs +967 -967
- data/vendor/kreuzberg/src/stopwords/mod.rs +1470 -1470
- data/vendor/kreuzberg/src/text/mod.rs +25 -25
- data/vendor/kreuzberg/src/text/quality.rs +697 -697
- data/vendor/kreuzberg/src/text/quality_processor.rs +219 -219
- data/vendor/kreuzberg/src/text/string_utils.rs +217 -217
- data/vendor/kreuzberg/src/text/token_reduction/cjk_utils.rs +164 -164
- data/vendor/kreuzberg/src/text/token_reduction/config.rs +100 -100
- data/vendor/kreuzberg/src/text/token_reduction/core.rs +796 -796
- data/vendor/kreuzberg/src/text/token_reduction/filters.rs +902 -902
- data/vendor/kreuzberg/src/text/token_reduction/mod.rs +160 -160
- data/vendor/kreuzberg/src/text/token_reduction/semantic.rs +619 -619
- data/vendor/kreuzberg/src/text/token_reduction/simd_text.rs +147 -147
- data/vendor/kreuzberg/src/types.rs +1055 -1055
- data/vendor/kreuzberg/src/utils/mod.rs +17 -17
- data/vendor/kreuzberg/src/utils/quality.rs +959 -959
- data/vendor/kreuzberg/src/utils/string_utils.rs +381 -381
- data/vendor/kreuzberg/stopwords/af_stopwords.json +53 -53
- data/vendor/kreuzberg/stopwords/ar_stopwords.json +482 -482
- data/vendor/kreuzberg/stopwords/bg_stopwords.json +261 -261
- data/vendor/kreuzberg/stopwords/bn_stopwords.json +400 -400
- data/vendor/kreuzberg/stopwords/br_stopwords.json +1205 -1205
- data/vendor/kreuzberg/stopwords/ca_stopwords.json +280 -280
- data/vendor/kreuzberg/stopwords/cs_stopwords.json +425 -425
- data/vendor/kreuzberg/stopwords/da_stopwords.json +172 -172
- data/vendor/kreuzberg/stopwords/de_stopwords.json +622 -622
- data/vendor/kreuzberg/stopwords/el_stopwords.json +849 -849
- data/vendor/kreuzberg/stopwords/en_stopwords.json +1300 -1300
- data/vendor/kreuzberg/stopwords/eo_stopwords.json +175 -175
- data/vendor/kreuzberg/stopwords/es_stopwords.json +734 -734
- data/vendor/kreuzberg/stopwords/et_stopwords.json +37 -37
- data/vendor/kreuzberg/stopwords/eu_stopwords.json +100 -100
- data/vendor/kreuzberg/stopwords/fa_stopwords.json +801 -801
- data/vendor/kreuzberg/stopwords/fi_stopwords.json +849 -849
- data/vendor/kreuzberg/stopwords/fr_stopwords.json +693 -693
- data/vendor/kreuzberg/stopwords/ga_stopwords.json +111 -111
- data/vendor/kreuzberg/stopwords/gl_stopwords.json +162 -162
- data/vendor/kreuzberg/stopwords/gu_stopwords.json +226 -226
- data/vendor/kreuzberg/stopwords/ha_stopwords.json +41 -41
- data/vendor/kreuzberg/stopwords/he_stopwords.json +196 -196
- data/vendor/kreuzberg/stopwords/hi_stopwords.json +227 -227
- data/vendor/kreuzberg/stopwords/hr_stopwords.json +181 -181
- data/vendor/kreuzberg/stopwords/hu_stopwords.json +791 -791
- data/vendor/kreuzberg/stopwords/hy_stopwords.json +47 -47
- data/vendor/kreuzberg/stopwords/id_stopwords.json +760 -760
- data/vendor/kreuzberg/stopwords/it_stopwords.json +634 -634
- data/vendor/kreuzberg/stopwords/ja_stopwords.json +136 -136
- data/vendor/kreuzberg/stopwords/kn_stopwords.json +84 -84
- data/vendor/kreuzberg/stopwords/ko_stopwords.json +681 -681
- data/vendor/kreuzberg/stopwords/ku_stopwords.json +64 -64
- data/vendor/kreuzberg/stopwords/la_stopwords.json +51 -51
- data/vendor/kreuzberg/stopwords/lt_stopwords.json +476 -476
- data/vendor/kreuzberg/stopwords/lv_stopwords.json +163 -163
- data/vendor/kreuzberg/stopwords/ml_stopwords.json +1 -1
- data/vendor/kreuzberg/stopwords/mr_stopwords.json +101 -101
- data/vendor/kreuzberg/stopwords/ms_stopwords.json +477 -477
- data/vendor/kreuzberg/stopwords/ne_stopwords.json +490 -490
- data/vendor/kreuzberg/stopwords/nl_stopwords.json +415 -415
- data/vendor/kreuzberg/stopwords/no_stopwords.json +223 -223
- data/vendor/kreuzberg/stopwords/pl_stopwords.json +331 -331
- data/vendor/kreuzberg/stopwords/pt_stopwords.json +562 -562
- data/vendor/kreuzberg/stopwords/ro_stopwords.json +436 -436
- data/vendor/kreuzberg/stopwords/ru_stopwords.json +561 -561
- data/vendor/kreuzberg/stopwords/si_stopwords.json +193 -193
- data/vendor/kreuzberg/stopwords/sk_stopwords.json +420 -420
- data/vendor/kreuzberg/stopwords/sl_stopwords.json +448 -448
- data/vendor/kreuzberg/stopwords/so_stopwords.json +32 -32
- data/vendor/kreuzberg/stopwords/st_stopwords.json +33 -33
- data/vendor/kreuzberg/stopwords/sv_stopwords.json +420 -420
- data/vendor/kreuzberg/stopwords/sw_stopwords.json +76 -76
- data/vendor/kreuzberg/stopwords/ta_stopwords.json +129 -129
- data/vendor/kreuzberg/stopwords/te_stopwords.json +54 -54
- data/vendor/kreuzberg/stopwords/th_stopwords.json +118 -118
- data/vendor/kreuzberg/stopwords/tl_stopwords.json +149 -149
- data/vendor/kreuzberg/stopwords/tr_stopwords.json +506 -506
- data/vendor/kreuzberg/stopwords/uk_stopwords.json +75 -75
- data/vendor/kreuzberg/stopwords/ur_stopwords.json +519 -519
- data/vendor/kreuzberg/stopwords/vi_stopwords.json +647 -647
- data/vendor/kreuzberg/stopwords/yo_stopwords.json +62 -62
- data/vendor/kreuzberg/stopwords/zh_stopwords.json +796 -796
- data/vendor/kreuzberg/stopwords/zu_stopwords.json +31 -31
- data/vendor/kreuzberg/tests/api_extract_multipart.rs +52 -52
- data/vendor/kreuzberg/tests/api_tests.rs +966 -966
- data/vendor/kreuzberg/tests/archive_integration.rs +545 -545
- data/vendor/kreuzberg/tests/batch_orchestration.rs +556 -556
- data/vendor/kreuzberg/tests/batch_processing.rs +318 -318
- data/vendor/kreuzberg/tests/bibtex_parity_test.rs +421 -421
- data/vendor/kreuzberg/tests/concurrency_stress.rs +533 -533
- data/vendor/kreuzberg/tests/config_features.rs +612 -612
- data/vendor/kreuzberg/tests/config_loading_tests.rs +416 -416
- data/vendor/kreuzberg/tests/core_integration.rs +510 -510
- data/vendor/kreuzberg/tests/csv_integration.rs +414 -414
- data/vendor/kreuzberg/tests/docbook_extractor_tests.rs +500 -500
- data/vendor/kreuzberg/tests/docx_metadata_extraction_test.rs +122 -122
- data/vendor/kreuzberg/tests/docx_vs_pandoc_comparison.rs +370 -370
- data/vendor/kreuzberg/tests/email_integration.rs +327 -327
- data/vendor/kreuzberg/tests/epub_native_extractor_tests.rs +275 -275
- data/vendor/kreuzberg/tests/error_handling.rs +402 -402
- data/vendor/kreuzberg/tests/fictionbook_extractor_tests.rs +228 -228
- data/vendor/kreuzberg/tests/format_integration.rs +164 -161
- data/vendor/kreuzberg/tests/helpers/mod.rs +142 -142
- data/vendor/kreuzberg/tests/html_table_test.rs +551 -551
- data/vendor/kreuzberg/tests/image_integration.rs +255 -255
- data/vendor/kreuzberg/tests/instrumentation_test.rs +139 -139
- data/vendor/kreuzberg/tests/jats_extractor_tests.rs +639 -639
- data/vendor/kreuzberg/tests/jupyter_extractor_tests.rs +704 -704
- data/vendor/kreuzberg/tests/keywords_integration.rs +479 -479
- data/vendor/kreuzberg/tests/keywords_quality.rs +509 -509
- data/vendor/kreuzberg/tests/latex_extractor_tests.rs +496 -496
- data/vendor/kreuzberg/tests/markdown_extractor_tests.rs +490 -490
- data/vendor/kreuzberg/tests/mime_detection.rs +429 -429
- data/vendor/kreuzberg/tests/ocr_configuration.rs +514 -514
- data/vendor/kreuzberg/tests/ocr_errors.rs +698 -698
- data/vendor/kreuzberg/tests/ocr_quality.rs +629 -629
- data/vendor/kreuzberg/tests/ocr_stress.rs +469 -469
- data/vendor/kreuzberg/tests/odt_extractor_tests.rs +674 -674
- data/vendor/kreuzberg/tests/opml_extractor_tests.rs +616 -616
- data/vendor/kreuzberg/tests/orgmode_extractor_tests.rs +822 -822
- data/vendor/kreuzberg/tests/pdf_integration.rs +45 -45
- data/vendor/kreuzberg/tests/pdfium_linking.rs +374 -374
- data/vendor/kreuzberg/tests/pipeline_integration.rs +1436 -1436
- data/vendor/kreuzberg/tests/plugin_ocr_backend_test.rs +776 -776
- data/vendor/kreuzberg/tests/plugin_postprocessor_test.rs +560 -560
- data/vendor/kreuzberg/tests/plugin_system.rs +927 -927
- data/vendor/kreuzberg/tests/plugin_validator_test.rs +783 -783
- data/vendor/kreuzberg/tests/registry_integration_tests.rs +587 -587
- data/vendor/kreuzberg/tests/rst_extractor_tests.rs +694 -694
- data/vendor/kreuzberg/tests/rtf_extractor_tests.rs +775 -775
- data/vendor/kreuzberg/tests/security_validation.rs +416 -416
- data/vendor/kreuzberg/tests/stopwords_integration_test.rs +888 -888
- data/vendor/kreuzberg/tests/test_fastembed.rs +631 -631
- data/vendor/kreuzberg/tests/typst_behavioral_tests.rs +1260 -1260
- data/vendor/kreuzberg/tests/typst_extractor_tests.rs +648 -648
- data/vendor/kreuzberg/tests/xlsx_metadata_extraction_test.rs +87 -87
- data/vendor/kreuzberg-ffi/Cargo.toml +63 -0
- data/vendor/kreuzberg-ffi/README.md +851 -0
- data/vendor/kreuzberg-ffi/build.rs +176 -0
- data/vendor/kreuzberg-ffi/cbindgen.toml +27 -0
- data/vendor/kreuzberg-ffi/kreuzberg-ffi-install.pc +12 -0
- data/vendor/kreuzberg-ffi/kreuzberg-ffi.pc.in +12 -0
- data/vendor/kreuzberg-ffi/kreuzberg.h +1087 -0
- data/vendor/kreuzberg-ffi/src/lib.rs +3616 -0
- data/vendor/kreuzberg-ffi/src/panic_shield.rs +247 -0
- data/vendor/kreuzberg-ffi/tests.disabled/README.md +48 -0
- data/vendor/kreuzberg-ffi/tests.disabled/config_loading_tests.rs +299 -0
- data/vendor/kreuzberg-ffi/tests.disabled/config_tests.rs +346 -0
- data/vendor/kreuzberg-ffi/tests.disabled/extractor_tests.rs +232 -0
- data/vendor/kreuzberg-ffi/tests.disabled/plugin_registration_tests.rs +470 -0
- data/vendor/kreuzberg-tesseract/.commitlintrc.json +13 -0
- data/vendor/kreuzberg-tesseract/.crate-ignore +2 -0
- data/vendor/kreuzberg-tesseract/Cargo.lock +2933 -0
- data/vendor/kreuzberg-tesseract/Cargo.toml +48 -0
- data/vendor/kreuzberg-tesseract/LICENSE +22 -0
- data/vendor/kreuzberg-tesseract/README.md +399 -0
- data/vendor/kreuzberg-tesseract/build.rs +1354 -0
- data/vendor/kreuzberg-tesseract/patches/README.md +71 -0
- data/vendor/kreuzberg-tesseract/patches/tesseract.diff +199 -0
- data/vendor/kreuzberg-tesseract/src/api.rs +1371 -0
- data/vendor/kreuzberg-tesseract/src/choice_iterator.rs +77 -0
- data/vendor/kreuzberg-tesseract/src/enums.rs +297 -0
- data/vendor/kreuzberg-tesseract/src/error.rs +81 -0
- data/vendor/kreuzberg-tesseract/src/lib.rs +145 -0
- data/vendor/kreuzberg-tesseract/src/monitor.rs +57 -0
- data/vendor/kreuzberg-tesseract/src/mutable_iterator.rs +197 -0
- data/vendor/kreuzberg-tesseract/src/page_iterator.rs +253 -0
- data/vendor/kreuzberg-tesseract/src/result_iterator.rs +286 -0
- data/vendor/kreuzberg-tesseract/src/result_renderer.rs +183 -0
- data/vendor/kreuzberg-tesseract/tests/integration_test.rs +211 -0
- data/vendor/rb-sys/.cargo_vcs_info.json +5 -5
- data/vendor/rb-sys/Cargo.lock +393 -393
- data/vendor/rb-sys/Cargo.toml +70 -70
- data/vendor/rb-sys/Cargo.toml.orig +57 -57
- data/vendor/rb-sys/LICENSE-APACHE +190 -190
- data/vendor/rb-sys/LICENSE-MIT +21 -21
- data/vendor/rb-sys/build/features.rs +111 -111
- data/vendor/rb-sys/build/main.rs +286 -286
- data/vendor/rb-sys/build/stable_api_config.rs +155 -155
- data/vendor/rb-sys/build/version.rs +50 -50
- data/vendor/rb-sys/readme.md +36 -36
- data/vendor/rb-sys/src/bindings.rs +21 -21
- data/vendor/rb-sys/src/hidden.rs +11 -11
- data/vendor/rb-sys/src/lib.rs +35 -35
- data/vendor/rb-sys/src/macros.rs +371 -371
- data/vendor/rb-sys/src/memory.rs +53 -53
- data/vendor/rb-sys/src/ruby_abi_version.rs +38 -38
- data/vendor/rb-sys/src/special_consts.rs +31 -31
- data/vendor/rb-sys/src/stable_api/compiled.c +179 -179
- data/vendor/rb-sys/src/stable_api/compiled.rs +257 -257
- data/vendor/rb-sys/src/stable_api/ruby_2_7.rs +324 -324
- data/vendor/rb-sys/src/stable_api/ruby_3_0.rs +332 -332
- data/vendor/rb-sys/src/stable_api/ruby_3_1.rs +325 -325
- data/vendor/rb-sys/src/stable_api/ruby_3_2.rs +323 -323
- data/vendor/rb-sys/src/stable_api/ruby_3_3.rs +339 -339
- data/vendor/rb-sys/src/stable_api/ruby_3_4.rs +339 -339
- data/vendor/rb-sys/src/stable_api.rs +260 -260
- data/vendor/rb-sys/src/symbol.rs +31 -31
- data/vendor/rb-sys/src/tracking_allocator.rs +330 -330
- data/vendor/rb-sys/src/utils.rs +89 -89
- data/vendor/rb-sys/src/value_type.rs +7 -7
- metadata +44 -81
- data/vendor/rb-sys/bin/release.sh +0 -21
|
@@ -1,85 +1,340 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Kreuzberg
|
|
4
|
-
# Provides extraction methods for documents and text.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
result
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Kreuzberg
|
|
4
|
+
# Provides extraction methods for documents and text.
|
|
5
|
+
#
|
|
6
|
+
# This module includes both synchronous and asynchronous methods for extracting
|
|
7
|
+
# content from files and byte data. Results are automatically cached based on
|
|
8
|
+
# configuration settings.
|
|
9
|
+
module ExtractionAPI
|
|
10
|
+
# Synchronously extract content from a file.
|
|
11
|
+
#
|
|
12
|
+
# Performs document extraction including text, tables, metadata, and optionally
|
|
13
|
+
# images. Supports various file formats (PDF, DOCX, XLSX, images, HTML, etc.)
|
|
14
|
+
# based on the detected or specified MIME type.
|
|
15
|
+
#
|
|
16
|
+
# @param path [String, Pathname] Path to the document file to extract
|
|
17
|
+
# @param mime_type [String, nil] Optional MIME type for the file (e.g., 'application/pdf').
|
|
18
|
+
# If omitted, type is detected from file extension.
|
|
19
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration controlling
|
|
20
|
+
# OCR settings, chunking, image extraction, and more. Accepts either a {Config::Extraction}
|
|
21
|
+
# object or a configuration hash.
|
|
22
|
+
#
|
|
23
|
+
# @return [Result] Extraction result containing content, metadata, tables, and images
|
|
24
|
+
#
|
|
25
|
+
# @raise [Errors::IOError] If the file cannot be read or access is denied
|
|
26
|
+
# @raise [Errors::ParsingError] If document parsing fails
|
|
27
|
+
# @raise [Errors::UnsupportedFormatError] If the file format is not supported
|
|
28
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails
|
|
29
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
30
|
+
#
|
|
31
|
+
# @example Extract a PDF file
|
|
32
|
+
# result = Kreuzberg.extract_file_sync("document.pdf")
|
|
33
|
+
# puts result.content
|
|
34
|
+
#
|
|
35
|
+
# @example Extract with explicit MIME type
|
|
36
|
+
# result = Kreuzberg.extract_file_sync("data.bin", mime_type: "application/pdf")
|
|
37
|
+
#
|
|
38
|
+
# @example Extract with OCR enabled
|
|
39
|
+
# config = Kreuzberg::Config::Extraction.new(
|
|
40
|
+
# force_ocr: true,
|
|
41
|
+
# ocr: Kreuzberg::Config::OCR.new(language: "eng")
|
|
42
|
+
# )
|
|
43
|
+
# result = Kreuzberg.extract_file_sync("scanned.pdf", config: config)
|
|
44
|
+
def extract_file_sync(path, mime_type: nil, config: nil)
|
|
45
|
+
opts = normalize_config(config)
|
|
46
|
+
hash = if mime_type
|
|
47
|
+
native_extract_file_sync(path.to_s, mime_type.to_s, **opts)
|
|
48
|
+
else
|
|
49
|
+
native_extract_file_sync(path.to_s, **opts)
|
|
50
|
+
end
|
|
51
|
+
result = Result.new(hash)
|
|
52
|
+
record_cache_entry!(result, opts)
|
|
53
|
+
result
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Synchronously extract content from byte data.
|
|
57
|
+
#
|
|
58
|
+
# Performs document extraction directly from binary data in memory. Useful for
|
|
59
|
+
# extracting content from files already loaded into memory or from network streams.
|
|
60
|
+
#
|
|
61
|
+
# @param data [String] Binary document data (can contain any byte values)
|
|
62
|
+
# @param mime_type [String] MIME type of the data (required, e.g., 'application/pdf').
|
|
63
|
+
# This parameter is mandatory to guide the extraction engine.
|
|
64
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration. Accepts
|
|
65
|
+
# either a {Config::Extraction} object or a configuration hash.
|
|
66
|
+
#
|
|
67
|
+
# @return [Result] Extraction result containing content, metadata, tables, and images
|
|
68
|
+
#
|
|
69
|
+
# @raise [Errors::ParsingError] If document parsing fails
|
|
70
|
+
# @raise [Errors::UnsupportedFormatError] If the MIME type is not supported
|
|
71
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails
|
|
72
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
73
|
+
#
|
|
74
|
+
# @example Extract PDF from memory
|
|
75
|
+
# pdf_data = File.read("document.pdf", binmode: true)
|
|
76
|
+
# result = Kreuzberg.extract_bytes_sync(pdf_data, "application/pdf")
|
|
77
|
+
# puts result.content
|
|
78
|
+
#
|
|
79
|
+
# @example Extract from a network stream
|
|
80
|
+
# response = HTTParty.get("https://example.com/document.docx")
|
|
81
|
+
# result = Kreuzberg.extract_bytes_sync(response.body, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
|
|
82
|
+
def extract_bytes_sync(data, mime_type, config: nil)
|
|
83
|
+
opts = normalize_config(config)
|
|
84
|
+
hash = native_extract_bytes_sync(data.to_s, mime_type.to_s, **opts)
|
|
85
|
+
result = Result.new(hash)
|
|
86
|
+
record_cache_entry!(result, opts)
|
|
87
|
+
result
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Synchronously extract content from multiple files.
|
|
91
|
+
#
|
|
92
|
+
# Processes multiple files in a single batch operation. Files are extracted sequentially,
|
|
93
|
+
# and results maintain the same order as the input paths. This is useful for bulk
|
|
94
|
+
# processing multiple documents with consistent configuration.
|
|
95
|
+
#
|
|
96
|
+
# @param paths [Array<String, Pathname>] Array of file paths to extract. Each path
|
|
97
|
+
# is converted to a string and MIME type is auto-detected from extension.
|
|
98
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration applied to all files.
|
|
99
|
+
# Accepts either a {Config::Extraction} object or a configuration hash.
|
|
100
|
+
#
|
|
101
|
+
# @return [Array<Result>] Array of extraction results in the same order as input paths.
|
|
102
|
+
# Array length matches the input paths length.
|
|
103
|
+
#
|
|
104
|
+
# @raise [Errors::IOError] If any file cannot be read
|
|
105
|
+
# @raise [Errors::ParsingError] If any document parsing fails
|
|
106
|
+
# @raise [Errors::UnsupportedFormatError] If any file format is not supported
|
|
107
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails on any document
|
|
108
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
109
|
+
#
|
|
110
|
+
# @example Batch extract multiple PDFs
|
|
111
|
+
# paths = ["doc1.pdf", "doc2.pdf", "doc3.pdf"]
|
|
112
|
+
# results = Kreuzberg.batch_extract_files_sync(paths)
|
|
113
|
+
# results.each_with_index do |result, idx|
|
|
114
|
+
# puts "File #{idx}: #{result.content.length} characters"
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# @example Batch extract with consistent configuration
|
|
118
|
+
# paths = Dir.glob("documents/*.pdf")
|
|
119
|
+
# config = Kreuzberg::Config::Extraction.new(force_ocr: true)
|
|
120
|
+
# results = Kreuzberg.batch_extract_files_sync(paths, config: config)
|
|
121
|
+
def batch_extract_files_sync(paths, config: nil)
|
|
122
|
+
opts = normalize_config(config)
|
|
123
|
+
hashes = native_batch_extract_files_sync(paths.map(&:to_s), **opts)
|
|
124
|
+
results = hashes.map { |hash| Result.new(hash) }
|
|
125
|
+
record_cache_entry!(results, opts)
|
|
126
|
+
results
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Asynchronously extract content from a file.
|
|
130
|
+
#
|
|
131
|
+
# Non-blocking extraction that returns a {Result} promise. Extraction is performed
|
|
132
|
+
# in the background using native threads or the Tokio runtime. This method is
|
|
133
|
+
# preferred for I/O-bound operations and integrating with async workflows.
|
|
134
|
+
#
|
|
135
|
+
# @param path [String, Pathname] Path to the document file to extract
|
|
136
|
+
# @param mime_type [String, nil] Optional MIME type for the file (e.g., 'application/pdf').
|
|
137
|
+
# If omitted, type is detected from file extension.
|
|
138
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration. Accepts
|
|
139
|
+
# either a {Config::Extraction} object or a configuration hash.
|
|
140
|
+
#
|
|
141
|
+
# @return [Result] Extraction result containing content, metadata, tables, and images.
|
|
142
|
+
# In async contexts, this result is available upon method return.
|
|
143
|
+
#
|
|
144
|
+
# @raise [Errors::IOError] If the file cannot be read or access is denied
|
|
145
|
+
# @raise [Errors::ParsingError] If document parsing fails
|
|
146
|
+
# @raise [Errors::UnsupportedFormatError] If the file format is not supported
|
|
147
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails
|
|
148
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
149
|
+
#
|
|
150
|
+
# @example Extract a PDF file asynchronously
|
|
151
|
+
# result = Kreuzberg.extract_file("large_document.pdf")
|
|
152
|
+
# puts result.content
|
|
153
|
+
#
|
|
154
|
+
# @example Extract with custom OCR configuration
|
|
155
|
+
# config = Kreuzberg::Config::Extraction.new(
|
|
156
|
+
# ocr: Kreuzberg::Config::OCR.new(language: "deu")
|
|
157
|
+
# )
|
|
158
|
+
# result = Kreuzberg.extract_file("document.pdf", config: config)
|
|
159
|
+
def extract_file(path, mime_type: nil, config: nil)
|
|
160
|
+
opts = normalize_config(config)
|
|
161
|
+
hash = if mime_type
|
|
162
|
+
native_extract_file(path.to_s, mime_type.to_s, **opts)
|
|
163
|
+
else
|
|
164
|
+
native_extract_file(path.to_s, **opts)
|
|
165
|
+
end
|
|
166
|
+
result = Result.new(hash)
|
|
167
|
+
record_cache_entry!(result, opts)
|
|
168
|
+
result
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Asynchronously extract content from byte data.
|
|
172
|
+
#
|
|
173
|
+
# Non-blocking extraction from in-memory binary data. Like {#extract_file},
|
|
174
|
+
# this performs extraction in the background, making it suitable for handling
|
|
175
|
+
# high-volume extraction workloads without blocking the main thread.
|
|
176
|
+
#
|
|
177
|
+
# @param data [String] Binary document data (can contain any byte values)
|
|
178
|
+
# @param mime_type [String] MIME type of the data (required, e.g., 'application/pdf').
|
|
179
|
+
# This parameter is mandatory to guide the extraction engine.
|
|
180
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration. Accepts
|
|
181
|
+
# either a {Config::Extraction} object or a configuration hash.
|
|
182
|
+
#
|
|
183
|
+
# @return [Result] Extraction result containing content, metadata, tables, and images
|
|
184
|
+
#
|
|
185
|
+
# @raise [Errors::ParsingError] If document parsing fails
|
|
186
|
+
# @raise [Errors::UnsupportedFormatError] If the MIME type is not supported
|
|
187
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails
|
|
188
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
189
|
+
#
|
|
190
|
+
# @example Extract PDF from memory asynchronously
|
|
191
|
+
# pdf_data = File.read("document.pdf", binmode: true)
|
|
192
|
+
# result = Kreuzberg.extract_bytes(pdf_data, "application/pdf")
|
|
193
|
+
# puts result.content
|
|
194
|
+
#
|
|
195
|
+
# @example Extract with image extraction
|
|
196
|
+
# data = File.read("file.docx", binmode: true)
|
|
197
|
+
# config = Kreuzberg::Config::Extraction.new(
|
|
198
|
+
# image_extraction: Kreuzberg::Config::ImageExtraction.new(extract_images: true)
|
|
199
|
+
# )
|
|
200
|
+
# result = Kreuzberg.extract_bytes(data, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", config: config)
|
|
201
|
+
def extract_bytes(data, mime_type, config: nil)
|
|
202
|
+
opts = normalize_config(config)
|
|
203
|
+
hash = native_extract_bytes(data.to_s, mime_type.to_s, **opts)
|
|
204
|
+
result = Result.new(hash)
|
|
205
|
+
record_cache_entry!(result, opts)
|
|
206
|
+
result
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Asynchronously extract content from multiple files.
|
|
210
|
+
#
|
|
211
|
+
# Non-blocking batch extraction from multiple files. Results maintain the same order
|
|
212
|
+
# as input paths. This is the preferred method for bulk processing when non-blocking
|
|
213
|
+
# I/O is required (e.g., in web servers or async applications).
|
|
214
|
+
#
|
|
215
|
+
# @param paths [Array<String, Pathname>] Array of file paths to extract. Each path
|
|
216
|
+
# is converted to a string and MIME type is auto-detected from extension.
|
|
217
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration applied to all files.
|
|
218
|
+
# Accepts either a {Config::Extraction} object or a configuration hash.
|
|
219
|
+
#
|
|
220
|
+
# @return [Array<Result>] Array of extraction results in the same order as input paths.
|
|
221
|
+
# Array length matches the input paths length.
|
|
222
|
+
#
|
|
223
|
+
# @raise [Errors::IOError] If any file cannot be read
|
|
224
|
+
# @raise [Errors::ParsingError] If any document parsing fails
|
|
225
|
+
# @raise [Errors::UnsupportedFormatError] If any file format is not supported
|
|
226
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails on any document
|
|
227
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
228
|
+
#
|
|
229
|
+
# @example Batch extract multiple files asynchronously
|
|
230
|
+
# paths = ["invoice_1.pdf", "invoice_2.pdf", "invoice_3.pdf"]
|
|
231
|
+
# results = Kreuzberg.batch_extract_files(paths)
|
|
232
|
+
# results.each_with_index do |result, idx|
|
|
233
|
+
# puts "Invoice #{idx}: #{result.detected_languages}"
|
|
234
|
+
# end
|
|
235
|
+
#
|
|
236
|
+
# @example Batch extract with chunking
|
|
237
|
+
# paths = Dir.glob("reports/*.docx")
|
|
238
|
+
# config = Kreuzberg::Config::Extraction.new(
|
|
239
|
+
# chunking: Kreuzberg::Config::Chunking.new(max_chars: 1000, max_overlap: 200)
|
|
240
|
+
# )
|
|
241
|
+
# results = Kreuzberg.batch_extract_files(paths, config: config)
|
|
242
|
+
def batch_extract_files(paths, config: nil)
|
|
243
|
+
opts = normalize_config(config)
|
|
244
|
+
hashes = native_batch_extract_files(paths.map(&:to_s), **opts)
|
|
245
|
+
results = hashes.map { |hash| Result.new(hash) }
|
|
246
|
+
record_cache_entry!(results, opts)
|
|
247
|
+
results
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Synchronously extract content from multiple byte data sources.
|
|
251
|
+
#
|
|
252
|
+
# Processes multiple in-memory binary documents in a single batch operation. Results
|
|
253
|
+
# maintain the same order as the input data array. The mime_types array must have
|
|
254
|
+
# the same length as the data_array.
|
|
255
|
+
#
|
|
256
|
+
# @param data_array [Array<String>] Array of binary document data. Each element can
|
|
257
|
+
# contain any byte values (e.g., PDF binary data).
|
|
258
|
+
# @param mime_types [Array<String>] Array of MIME types corresponding to each data item.
|
|
259
|
+
# Must be the same length as data_array (e.g., ["application/pdf", "application/msword"]).
|
|
260
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration applied to all items.
|
|
261
|
+
# Accepts either a {Config::Extraction} object or a configuration hash.
|
|
262
|
+
#
|
|
263
|
+
# @return [Array<Result>] Array of extraction results in the same order as input data.
|
|
264
|
+
# Array length matches the data_array length.
|
|
265
|
+
#
|
|
266
|
+
# @raise [ArgumentError] If data_array and mime_types have different lengths
|
|
267
|
+
# @raise [Errors::ParsingError] If any document parsing fails
|
|
268
|
+
# @raise [Errors::UnsupportedFormatError] If any MIME type is not supported
|
|
269
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails on any document
|
|
270
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
271
|
+
#
|
|
272
|
+
# @example Batch extract binary documents
|
|
273
|
+
# pdf_data_1 = File.read("doc1.pdf", binmode: true)
|
|
274
|
+
# pdf_data_2 = File.read("doc2.pdf", binmode: true)
|
|
275
|
+
# docx_data = File.read("report.docx", binmode: true)
|
|
276
|
+
#
|
|
277
|
+
# data = [pdf_data_1, pdf_data_2, docx_data]
|
|
278
|
+
# types = ["application/pdf", "application/pdf", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"]
|
|
279
|
+
# results = Kreuzberg.batch_extract_bytes_sync(data, types)
|
|
280
|
+
# results.each { |r| puts r.content }
|
|
281
|
+
def batch_extract_bytes_sync(data_array, mime_types, config: nil)
|
|
282
|
+
opts = normalize_config(config)
|
|
283
|
+
hashes = native_batch_extract_bytes_sync(data_array.map(&:to_s), mime_types.map(&:to_s), **opts)
|
|
284
|
+
results = hashes.map { |hash| Result.new(hash) }
|
|
285
|
+
record_cache_entry!(results, opts)
|
|
286
|
+
results
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Asynchronously extract content from multiple byte data sources.
|
|
290
|
+
#
|
|
291
|
+
# Non-blocking batch extraction from multiple in-memory binary documents. Results
|
|
292
|
+
# maintain the same order as the input data array. This method is preferred when
|
|
293
|
+
# processing multiple documents without blocking (e.g., handling multiple uploads).
|
|
294
|
+
#
|
|
295
|
+
# @param data_array [Array<String>] Array of binary document data. Each element can
|
|
296
|
+
# contain any byte values (e.g., PDF binary data).
|
|
297
|
+
# @param mime_types [Array<String>] Array of MIME types corresponding to each data item.
|
|
298
|
+
# Must be the same length as data_array (e.g., ["application/pdf", "application/msword"]).
|
|
299
|
+
# @param config [Config::Extraction, Hash, nil] Extraction configuration applied to all items.
|
|
300
|
+
# Accepts either a {Config::Extraction} object or a configuration hash.
|
|
301
|
+
#
|
|
302
|
+
# @return [Array<Result>] Array of extraction results in the same order as input data.
|
|
303
|
+
# Array length matches the data_array length.
|
|
304
|
+
#
|
|
305
|
+
# @raise [ArgumentError] If data_array and mime_types have different lengths
|
|
306
|
+
# @raise [Errors::ParsingError] If any document parsing fails
|
|
307
|
+
# @raise [Errors::UnsupportedFormatError] If any MIME type is not supported
|
|
308
|
+
# @raise [Errors::OCRError] If OCR is enabled and fails on any document
|
|
309
|
+
# @raise [Errors::MissingDependencyError] If a required dependency is missing
|
|
310
|
+
#
|
|
311
|
+
# @example Batch extract uploaded documents asynchronously
|
|
312
|
+
# # From a web request with multiple file uploads
|
|
313
|
+
# uploaded_files = params[:files] # Array of uploaded file objects
|
|
314
|
+
# data = uploaded_files.map(&:read)
|
|
315
|
+
# types = uploaded_files.map(&:content_type)
|
|
316
|
+
#
|
|
317
|
+
# results = Kreuzberg.batch_extract_bytes(data, types)
|
|
318
|
+
# results.each { |r| puts r.content }
|
|
319
|
+
#
|
|
320
|
+
# @example Batch extract with OCR
|
|
321
|
+
# data = [scan_1_bytes, scan_2_bytes, scan_3_bytes]
|
|
322
|
+
# types = ["image/png", "image/png", "image/png"]
|
|
323
|
+
# config = Kreuzberg::Config::Extraction.new(force_ocr: true)
|
|
324
|
+
# results = Kreuzberg.batch_extract_bytes(data, types, config: config)
|
|
325
|
+
def batch_extract_bytes(data_array, mime_types, config: nil)
|
|
326
|
+
opts = normalize_config(config)
|
|
327
|
+
hashes = native_batch_extract_bytes(data_array.map(&:to_s), mime_types.map(&:to_s), **opts)
|
|
328
|
+
results = hashes.map { |hash| Result.new(hash) }
|
|
329
|
+
record_cache_entry!(results, opts)
|
|
330
|
+
results
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def normalize_config(config)
|
|
334
|
+
return {} if config.nil?
|
|
335
|
+
return config if config.is_a?(Hash)
|
|
336
|
+
|
|
337
|
+
config.to_h
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|