xberg 1.0.0.pre.rc.7 → 1.0.0.pre.rc.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8dd187e353e4926f840bca1b2fd8ac9aa099ff3b844580d4e325f78f1f20a547
4
- data.tar.gz: 3d421a8ab9b4beb0539e4ba899af07c1ffea3b235c40d6ffc9633f6a80a6b69b
3
+ metadata.gz: c426c771373b092f070bb61bb9479785b38fce29336a8ccca7a99203715351f6
4
+ data.tar.gz: 5b206ba76956c60c6ff3eb3d567a8792fecf71be02203354dc9a5d99edb4359b
5
5
  SHA512:
6
- metadata.gz: 8c640729c97cf6cc2a290b30823908cb46a3c74d2a032f03c222d8c6666e7a1c8451f0d957e0aa8b3a38fc47a4cc89eebfeb46361ede09323e5218e66af617cb
7
- data.tar.gz: 8f6a497814c9215b7aeef1c326477e0b17ccfa2b0f30f10023f9488c99453ff51e7412299a957c8c7f99368e29773723e27ce9a01683f653792fdc9cc5495d35
6
+ metadata.gz: 1934ce27152766156b6446d41ee34e257469374ee6436f01c5a9b08e43fc35e505a07b32069d2b6a75071f7eda215d030e52e39bfcf9d0ee66cd857b773e303f
7
+ data.tar.gz: b0067920fc491c15012fa0117193d027081ac365d8b8b31c04eb92de7fd3d9ed34c88f019d47fc365620bbc8ff79e427cd54ee48ec6a6da93394ecdeab9f74f5
@@ -1486,9 +1486,9 @@ checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2"
1486
1486
 
1487
1487
  [[package]]
1488
1488
  name = "defmt"
1489
- version = "1.1.0"
1489
+ version = "1.1.1"
1490
1490
  source = "registry+https://github.com/rust-lang/crates.io-index"
1491
- checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f"
1491
+ checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1"
1492
1492
  dependencies = [
1493
1493
  "bitflags 1.3.2",
1494
1494
  "defmt-macros",
@@ -1496,12 +1496,11 @@ dependencies = [
1496
1496
 
1497
1497
  [[package]]
1498
1498
  name = "defmt-macros"
1499
- version = "1.1.0"
1499
+ version = "1.1.1"
1500
1500
  source = "registry+https://github.com/rust-lang/crates.io-index"
1501
- checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b"
1501
+ checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8"
1502
1502
  dependencies = [
1503
1503
  "defmt-parser",
1504
- "proc-macro-error2",
1505
1504
  "proc-macro2",
1506
1505
  "quote",
1507
1506
  "syn 2.0.118",
@@ -3174,6 +3173,36 @@ dependencies = [
3174
3173
  "windows-sys 0.45.0",
3175
3174
  ]
3176
3175
 
3176
+ [[package]]
3177
+ name = "jni"
3178
+ version = "0.22.4"
3179
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3180
+ checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
3181
+ dependencies = [
3182
+ "cfg-if",
3183
+ "combine",
3184
+ "jni-macros",
3185
+ "jni-sys 0.4.1",
3186
+ "log",
3187
+ "simd_cesu8",
3188
+ "thiserror 2.0.18",
3189
+ "walkdir",
3190
+ "windows-link",
3191
+ ]
3192
+
3193
+ [[package]]
3194
+ name = "jni-macros"
3195
+ version = "0.22.4"
3196
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3197
+ checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
3198
+ dependencies = [
3199
+ "proc-macro2",
3200
+ "quote",
3201
+ "rustc_version",
3202
+ "simd_cesu8",
3203
+ "syn 2.0.118",
3204
+ ]
3205
+
3177
3206
  [[package]]
3178
3207
  name = "jni-sys"
3179
3208
  version = "0.3.1"
@@ -3997,9 +4026,9 @@ dependencies = [
3997
4026
 
3998
4027
  [[package]]
3999
4028
  name = "num-bigint"
4000
- version = "0.4.7"
4029
+ version = "0.4.8"
4001
4030
  source = "registry+https://github.com/rust-lang/crates.io-index"
4002
- checksum = "c863e9ab5e7bf9c99ba75e1050f1e4d624ae87ed3532d6238ffbdc7b585dbbe6"
4031
+ checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
4003
4032
  dependencies = [
4004
4033
  "num-integer",
4005
4034
  "num-traits",
@@ -4096,16 +4125,16 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
4096
4125
 
4097
4126
  [[package]]
4098
4127
  name = "office_oxide"
4099
- version = "0.1.2"
4128
+ version = "0.1.3"
4100
4129
  source = "registry+https://github.com/rust-lang/crates.io-index"
4101
- checksum = "866a8fa5e1a756f8cc9f9f614031ad7e33adc7f6972eab74a35b0c799fe08da5"
4130
+ checksum = "8900703278aea7d2329f5c490b62653306b1083efc7993ee18e3e86dcfd5afeb"
4102
4131
  dependencies = [
4103
4132
  "atoi_simd 0.18.1",
4104
4133
  "encoding_rs",
4105
4134
  "fast-float2",
4106
4135
  "libc",
4107
4136
  "log",
4108
- "quick-xml 0.40.1",
4137
+ "quick-xml 0.41.0",
4109
4138
  "serde",
4110
4139
  "serde_json",
4111
4140
  "thiserror 2.0.18",
@@ -4321,9 +4350,9 @@ dependencies = [
4321
4350
 
4322
4351
  [[package]]
4323
4352
  name = "pdf_oxide"
4324
- version = "0.3.70"
4353
+ version = "0.3.72"
4325
4354
  source = "registry+https://github.com/rust-lang/crates.io-index"
4326
- checksum = "3be9e4752f2319dec7c079ca96ec141e1be70faac82b21cb06a53bb6c2e0034e"
4355
+ checksum = "3b7fe525ccb850888a423bd211c1efd1af704761a7084e83edae1b99d0c7d2b4"
4327
4356
  dependencies = [
4328
4357
  "aes 0.9.1",
4329
4358
  "base64 0.22.1",
@@ -4646,28 +4675,6 @@ dependencies = [
4646
4675
  "toml_edit",
4647
4676
  ]
4648
4677
 
4649
- [[package]]
4650
- name = "proc-macro-error-attr2"
4651
- version = "2.0.0"
4652
- source = "registry+https://github.com/rust-lang/crates.io-index"
4653
- checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
4654
- dependencies = [
4655
- "proc-macro2",
4656
- "quote",
4657
- ]
4658
-
4659
- [[package]]
4660
- name = "proc-macro-error2"
4661
- version = "2.0.1"
4662
- source = "registry+https://github.com/rust-lang/crates.io-index"
4663
- checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
4664
- dependencies = [
4665
- "proc-macro-error-attr2",
4666
- "proc-macro2",
4667
- "quote",
4668
- "syn 2.0.118",
4669
- ]
4670
-
4671
4678
  [[package]]
4672
4679
  name = "proc-macro2"
4673
4680
  version = "1.0.106"
@@ -4824,16 +4831,6 @@ dependencies = [
4824
4831
  "memchr",
4825
4832
  ]
4826
4833
 
4827
- [[package]]
4828
- name = "quick-xml"
4829
- version = "0.40.1"
4830
- source = "registry+https://github.com/rust-lang/crates.io-index"
4831
- checksum = "2474bd2e5029e7ccb6abb2ba48cf2383a333851dedf495901544281590c7da7f"
4832
- dependencies = [
4833
- "memchr",
4834
- "serde",
4835
- ]
4836
-
4837
4834
  [[package]]
4838
4835
  name = "quick-xml"
4839
4836
  version = "0.41.0"
@@ -5290,7 +5287,7 @@ dependencies = [
5290
5287
  "quinn",
5291
5288
  "rustls",
5292
5289
  "rustls-pki-types",
5293
- "rustls-platform-verifier",
5290
+ "rustls-platform-verifier 0.7.0",
5294
5291
  "serde",
5295
5292
  "serde_json",
5296
5293
  "serde_urlencoded",
@@ -5493,6 +5490,15 @@ version = "2.1.3"
5493
5490
  source = "registry+https://github.com/rust-lang/crates.io-index"
5494
5491
  checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
5495
5492
 
5493
+ [[package]]
5494
+ name = "rustc_version"
5495
+ version = "0.4.1"
5496
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5497
+ checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
5498
+ dependencies = [
5499
+ "semver",
5500
+ ]
5501
+
5496
5502
  [[package]]
5497
5503
  name = "rustfft"
5498
5504
  version = "6.4.1"
@@ -5566,7 +5572,28 @@ checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784"
5566
5572
  dependencies = [
5567
5573
  "core-foundation 0.10.1",
5568
5574
  "core-foundation-sys",
5569
- "jni",
5575
+ "jni 0.21.1",
5576
+ "log",
5577
+ "once_cell",
5578
+ "rustls",
5579
+ "rustls-native-certs",
5580
+ "rustls-platform-verifier-android",
5581
+ "rustls-webpki",
5582
+ "security-framework",
5583
+ "security-framework-sys",
5584
+ "webpki-root-certs",
5585
+ "windows-sys 0.61.2",
5586
+ ]
5587
+
5588
+ [[package]]
5589
+ name = "rustls-platform-verifier"
5590
+ version = "0.7.0"
5591
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5592
+ checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0"
5593
+ dependencies = [
5594
+ "core-foundation 0.10.1",
5595
+ "core-foundation-sys",
5596
+ "jni 0.22.4",
5570
5597
  "log",
5571
5598
  "once_cell",
5572
5599
  "rustls",
@@ -5725,6 +5752,12 @@ dependencies = [
5725
5752
  "libc",
5726
5753
  ]
5727
5754
 
5755
+ [[package]]
5756
+ name = "semver"
5757
+ version = "1.0.28"
5758
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5759
+ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
5760
+
5728
5761
  [[package]]
5729
5762
  name = "seq-macro"
5730
5763
  version = "0.3.6"
@@ -5953,6 +5986,16 @@ version = "0.3.9"
5953
5986
  source = "registry+https://github.com/rust-lang/crates.io-index"
5954
5987
  checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
5955
5988
 
5989
+ [[package]]
5990
+ name = "simd_cesu8"
5991
+ version = "1.1.1"
5992
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5993
+ checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33"
5994
+ dependencies = [
5995
+ "rustc_version",
5996
+ "simdutf8",
5997
+ ]
5998
+
5956
5999
  [[package]]
5957
6000
  name = "simd_helpers"
5958
6001
  version = "0.1.0"
@@ -7022,9 +7065,9 @@ checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782"
7022
7065
 
7023
7066
  [[package]]
7024
7067
  name = "tree-sitter-language-pack"
7025
- version = "1.12.3"
7068
+ version = "1.12.4"
7026
7069
  source = "registry+https://github.com/rust-lang/crates.io-index"
7027
- checksum = "32def7d253a2662db9a32196440b07bb0e9731a2133dbad0ed42239f94d548ea"
7070
+ checksum = "d49e30d1927ccc08599c054380bda399817781f74eb9184007e90606c7ff3a2c"
7028
7071
  dependencies = [
7029
7072
  "ahash 0.8.12",
7030
7073
  "cc",
@@ -7084,15 +7127,15 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
7084
7127
 
7085
7128
  [[package]]
7086
7129
  name = "unhwp"
7087
- version = "0.5.1"
7130
+ version = "0.5.2"
7088
7131
  source = "registry+https://github.com/rust-lang/crates.io-index"
7089
- checksum = "4b0109dc52c6db66836c28af0d86f051b0a846f8c7a0a483fd9debd90f431279"
7132
+ checksum = "9db2add52da5275c7e850c5b2da1d8e580b223cd18a97807afcbd1026ffe3525"
7090
7133
  dependencies = [
7091
7134
  "cfb 0.10.0",
7092
7135
  "flate2",
7093
7136
  "pulldown-cmark 0.12.2",
7094
7137
  "pulldown-cmark-to-cmark",
7095
- "quick-xml 0.37.5",
7138
+ "quick-xml 0.41.0",
7096
7139
  "rayon",
7097
7140
  "regex",
7098
7141
  "serde",
@@ -7248,7 +7291,7 @@ dependencies = [
7248
7291
  "percent-encoding",
7249
7292
  "rustls",
7250
7293
  "rustls-pki-types",
7251
- "rustls-platform-verifier",
7294
+ "rustls-platform-verifier 0.6.2",
7252
7295
  "serde",
7253
7296
  "serde_json",
7254
7297
  "socks",
@@ -8020,9 +8063,9 @@ dependencies = [
8020
8063
 
8021
8064
  [[package]]
8022
8065
  name = "xberg"
8023
- version = "1.0.0-rc.7"
8066
+ version = "1.0.0-rc.9"
8024
8067
  source = "registry+https://github.com/rust-lang/crates.io-index"
8025
- checksum = "ae067a49ec38ff99d501d0e4bc745f5a1332dd22a86b3085083e219531249191"
8068
+ checksum = "627033553a27835485fee775b7b10cf8ed4e162f12d0df4e077ffb45846944f3"
8026
8069
  dependencies = [
8027
8070
  "ahash 0.8.12",
8028
8071
  "async-trait",
@@ -8138,9 +8181,9 @@ dependencies = [
8138
8181
 
8139
8182
  [[package]]
8140
8183
  name = "xberg-gliner"
8141
- version = "1.0.0-rc.7"
8184
+ version = "1.0.0-rc.9"
8142
8185
  source = "registry+https://github.com/rust-lang/crates.io-index"
8143
- checksum = "c2d29a5fcf85c2cc09f22be902f04c7e57e80d8902b044750293c7974c54c8cc"
8186
+ checksum = "86e43aeca6ee9066bb9a457c8f5649705b8e04d0e04645103ad60fdbdd8596b6"
8144
8187
  dependencies = [
8145
8188
  "ndarray 0.17.2",
8146
8189
  "ort",
@@ -8152,9 +8195,9 @@ dependencies = [
8152
8195
 
8153
8196
  [[package]]
8154
8197
  name = "xberg-libheif"
8155
- version = "1.0.0-rc.7"
8198
+ version = "1.0.0-rc.9"
8156
8199
  source = "registry+https://github.com/rust-lang/crates.io-index"
8157
- checksum = "2913e23c08a64d6ecb3a3318fbc615f1f046a8b33f40a849a42a484862c594b8"
8200
+ checksum = "47142402f9ab8e1f1041acb5d8fbd3dae397fd9a6b4c65f22be9c4434c81731b"
8158
8201
  dependencies = [
8159
8202
  "cfg-if",
8160
8203
  "enumn",
@@ -8165,9 +8208,9 @@ dependencies = [
8165
8208
 
8166
8209
  [[package]]
8167
8210
  name = "xberg-paddle-ocr"
8168
- version = "1.0.0-rc.7"
8211
+ version = "1.0.0-rc.9"
8169
8212
  source = "registry+https://github.com/rust-lang/crates.io-index"
8170
- checksum = "797b2d23626c27d87aaa2831d23066f3260940c2ec740d540014299d07537c1c"
8213
+ checksum = "d0d77debe5b69db07cb3a184bf240c3e33414bf37540f27c0586fcfc0dc47b7d"
8171
8214
  dependencies = [
8172
8215
  "geo-clipper",
8173
8216
  "geo-types",
@@ -8182,7 +8225,7 @@ dependencies = [
8182
8225
 
8183
8226
  [[package]]
8184
8227
  name = "xberg-rb"
8185
- version = "1.0.0-rc.7"
8228
+ version = "1.0.0-rc.9"
8186
8229
  dependencies = [
8187
8230
  "async-trait",
8188
8231
  "crawlberg",
@@ -8196,9 +8239,9 @@ dependencies = [
8196
8239
 
8197
8240
  [[package]]
8198
8241
  name = "xberg-tesseract"
8199
- version = "1.0.0-rc.7"
8242
+ version = "1.0.0-rc.9"
8200
8243
  source = "registry+https://github.com/rust-lang/crates.io-index"
8201
- checksum = "9e290213d7492421f7e0e83bb43e747aeb13c05df3a113328e0496cb3c248607"
8244
+ checksum = "7ec0056f3798302ed20cf62cea73a1eac49c987758d7bd52585a55f8e2b8648a"
8202
8245
  dependencies = [
8203
8246
  "cc",
8204
8247
  "cmake",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "xberg-rb"
3
- version = "1.0.0-rc.7"
3
+ version = "1.0.0-rc.9"
4
4
  edition = "2024"
5
5
  license = "MIT"
6
6
  description = "High-performance document intelligence library"
@@ -49,17 +49,17 @@ xml = ["xberg/xml"]
49
49
 
50
50
  [dependencies]
51
51
  async-trait = "0.1"
52
- crawlberg = { default-features = false, version = "1.0.2" }
52
+ crawlberg = { default-features = false, version = "1.0.3" }
53
53
  magnus = "0.8"
54
54
  rb-sys = ">=0.9, <0.9.128"
55
55
  serde = { version = "1", features = ["derive"] }
56
56
  serde_json = "1"
57
57
  tokio = { version = "1", features = ["rt-multi-thread"] }
58
58
  [target.'cfg(not(any(target_os = "windows", all(target_os = "macos", target_arch = "x86_64"))))'.dependencies]
59
- xberg = { version = "1.0.0-rc.7", features = ["full", "pdf", "ocr", "paddle-ocr", "paddle-ocr-types", "layout-detection", "layout-types", "embeddings", "embedding-presets", "reranker", "reranker-presets", "chunking", "keywords-yake", "keywords-rake", "language-detection", "html", "tree-sitter", "office", "email", "archives", "stopwords", "auto-rotate", "auto-rotate-types", "tokio-runtime", "api", "api-types", "mcp", "liter-llm", "quality", "svg", "transcription", "transcription-types", "classification", "captioning", "ner-onnx", "ner-llm", "diff", "markdown-footnotes", "redaction", "enrichment", "heuristics", "presets", "structured", "url-ingestion"] }
59
+ xberg = { version = "1.0.0-rc.9", features = ["full", "pdf", "ocr", "paddle-ocr", "paddle-ocr-types", "layout-detection", "layout-types", "embeddings", "embedding-presets", "reranker", "reranker-presets", "chunking", "keywords-yake", "keywords-rake", "language-detection", "html", "tree-sitter", "office", "email", "archives", "stopwords", "auto-rotate", "auto-rotate-types", "tokio-runtime", "api", "api-types", "mcp", "liter-llm", "quality", "svg", "transcription", "transcription-types", "classification", "captioning", "ner-onnx", "ner-llm", "diff", "markdown-footnotes", "redaction", "enrichment", "heuristics", "presets", "structured", "url-ingestion"] }
60
60
 
61
61
  [target.'cfg(target_os = "windows")'.dependencies]
62
- xberg = { version = "1.0.0-rc.7", features = ["windows-target"] }
62
+ xberg = { version = "1.0.0-rc.9", features = ["windows-target"] }
63
63
 
64
64
  [target.'cfg(all(target_os = "macos", target_arch = "x86_64"))'.dependencies]
65
- xberg = { version = "1.0.0-rc.7", features = ["macos-intel-target"] }
65
+ xberg = { version = "1.0.0-rc.9", features = ["macos-intel-target"] }
@@ -1,5 +1,5 @@
1
1
  // This file is auto-generated by alef. DO NOT EDIT.
2
- // alef:hash:0ce3ea7bbabccafc622b4dd87ac0f00356dd0426ec66977c856525dabafdc585
2
+ // alef:hash:28933e85bc9dc440d3d48a0fa997a78b13df863b6249812908ba7914441b9232
3
3
  // Re-generate with: alef generate
4
4
  #![allow(dead_code, unused_imports, unused_variables)]
5
5
  #![allow(
@@ -24634,6 +24634,16 @@ fn list_reranker_backends() -> Result<Vec<String>, Error> {
24634
24634
  Ok(result)
24635
24635
  }
24636
24636
 
24637
+ fn list_tokenizer_backends() -> Result<Vec<String>, Error> {
24638
+ let result = xberg::list_tokenizer_backends().map_err(|e| {
24639
+ magnus::Error::new(
24640
+ unsafe { Ruby::get_unchecked() }.exception_runtime_error(),
24641
+ e.to_string(),
24642
+ )
24643
+ })?;
24644
+ Ok(result)
24645
+ }
24646
+
24637
24647
  fn list_validators() -> Result<Vec<String>, Error> {
24638
24648
  let result = xberg::list_validators().map_err(|e| {
24639
24649
  magnus::Error::new(
@@ -24732,11 +24742,17 @@ impl xberg::plugins::Plugin for RbOcrBackendBridge {
24732
24742
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
24733
24743
  Ok(v) => v,
24734
24744
  Err(e) => {
24735
- let _ = e;
24745
+ // This method's Rust signature is infallible, so a Ruby exception cannot
24746
+ // propagate. Log before substituting the default — a silent default is
24747
+ // indistinguishable from a real result to the caller.
24748
+ eprintln!("[RbOcrBackendBridge] host 'version' raised; returning default: {e}");
24736
24749
  return Default::default();
24737
24750
  }
24738
24751
  };
24739
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
24752
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
24753
+ eprintln!("[RbOcrBackendBridge] host 'version' returned an unconvertible value; returning default: {e}");
24754
+ Default::default()
24755
+ })
24740
24756
  }
24741
24757
 
24742
24758
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -24941,11 +24957,19 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
24941
24957
  ) {
24942
24958
  Ok(v) => v,
24943
24959
  Err(e) => {
24944
- let _ = e;
24960
+ // This method's Rust signature is infallible, so a Ruby exception cannot
24961
+ // propagate. Log before substituting the default — a silent default is
24962
+ // indistinguishable from a real result to the caller.
24963
+ eprintln!("[RbOcrBackendBridge] host 'supports_language' raised; returning default: {e}");
24945
24964
  return Default::default();
24946
24965
  }
24947
24966
  };
24948
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
24967
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
24968
+ eprintln!(
24969
+ "[RbOcrBackendBridge] host 'supports_language' returned an unconvertible value; returning default: {e}"
24970
+ );
24971
+ Default::default()
24972
+ })
24949
24973
  }
24950
24974
 
24951
24975
  fn backend_type(&self) -> xberg::OcrBackendType {
@@ -24955,7 +24979,10 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
24955
24979
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("backend_type", ()) {
24956
24980
  Ok(v) => v,
24957
24981
  Err(e) => {
24958
- let _ = e;
24982
+ // This method's Rust signature is infallible, so a Ruby exception cannot
24983
+ // propagate. Log before substituting the default — a silent default is
24984
+ // indistinguishable from a real result to the caller.
24985
+ eprintln!("[RbOcrBackendBridge] host 'backend_type' raised; returning default: {e}");
24959
24986
  return Default::default();
24960
24987
  }
24961
24988
  };
@@ -24965,12 +24992,17 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
24965
24992
  match val.funcall::<_, _, String>("to_json", ()) {
24966
24993
  Ok(s) => s,
24967
24994
  Err(e) => {
24968
- let _ = e;
24995
+ eprintln!(
24996
+ "[RbOcrBackendBridge] host 'backend_type' returned a non-JSON value; returning default: {e}"
24997
+ );
24969
24998
  return Default::default();
24970
24999
  }
24971
25000
  }
24972
25001
  };
24973
- serde_json::from_str::<xberg::OcrBackendType>(&json_str).unwrap_or_default()
25002
+ serde_json::from_str::<xberg::OcrBackendType>(&json_str).unwrap_or_else(|e| {
25003
+ eprintln!("[RbOcrBackendBridge] host 'backend_type' returned an unparseable value; returning default: {e}");
25004
+ Default::default()
25005
+ })
24974
25006
  }
24975
25007
 
24976
25008
  fn supported_languages(&self) -> Vec<String> {
@@ -24983,11 +25015,17 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
24983
25015
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("supported_languages", ()) {
24984
25016
  Ok(v) => v,
24985
25017
  Err(e) => {
24986
- let _ = e;
25018
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25019
+ // propagate. Log before substituting the default — a silent default is
25020
+ // indistinguishable from a real result to the caller.
25021
+ eprintln!("[RbOcrBackendBridge] host 'supported_languages' raised; returning default: {e}");
24987
25022
  return Default::default();
24988
25023
  }
24989
25024
  };
24990
- <Vec<String> as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25025
+ <Vec<String> as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25026
+ eprintln!("[RbOcrBackendBridge] host 'supported_languages' returned an unconvertible value; returning default: {e}");
25027
+ Default::default()
25028
+ })
24991
25029
  }
24992
25030
 
24993
25031
  fn supports_table_detection(&self) -> bool {
@@ -25000,11 +25038,17 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
25000
25038
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("supports_table_detection", ()) {
25001
25039
  Ok(v) => v,
25002
25040
  Err(e) => {
25003
- let _ = e;
25041
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25042
+ // propagate. Log before substituting the default — a silent default is
25043
+ // indistinguishable from a real result to the caller.
25044
+ eprintln!("[RbOcrBackendBridge] host 'supports_table_detection' raised; returning default: {e}");
25004
25045
  return Default::default();
25005
25046
  }
25006
25047
  };
25007
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25048
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25049
+ eprintln!("[RbOcrBackendBridge] host 'supports_table_detection' returned an unconvertible value; returning default: {e}");
25050
+ Default::default()
25051
+ })
25008
25052
  }
25009
25053
 
25010
25054
  fn supports_document_processing(&self) -> bool {
@@ -25017,11 +25061,17 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
25017
25061
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("supports_document_processing", ()) {
25018
25062
  Ok(v) => v,
25019
25063
  Err(e) => {
25020
- let _ = e;
25064
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25065
+ // propagate. Log before substituting the default — a silent default is
25066
+ // indistinguishable from a real result to the caller.
25067
+ eprintln!("[RbOcrBackendBridge] host 'supports_document_processing' raised; returning default: {e}");
25021
25068
  return Default::default();
25022
25069
  }
25023
25070
  };
25024
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25071
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25072
+ eprintln!("[RbOcrBackendBridge] host 'supports_document_processing' returned an unconvertible value; returning default: {e}");
25073
+ Default::default()
25074
+ })
25025
25075
  }
25026
25076
 
25027
25077
  fn emits_structured_markdown(&self) -> bool {
@@ -25034,11 +25084,17 @@ impl xberg::OcrBackend for RbOcrBackendBridge {
25034
25084
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("emits_structured_markdown", ()) {
25035
25085
  Ok(v) => v,
25036
25086
  Err(e) => {
25037
- let _ = e;
25087
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25088
+ // propagate. Log before substituting the default — a silent default is
25089
+ // indistinguishable from a real result to the caller.
25090
+ eprintln!("[RbOcrBackendBridge] host 'emits_structured_markdown' raised; returning default: {e}");
25038
25091
  return Default::default();
25039
25092
  }
25040
25093
  };
25041
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25094
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25095
+ eprintln!("[RbOcrBackendBridge] host 'emits_structured_markdown' returned an unconvertible value; returning default: {e}");
25096
+ Default::default()
25097
+ })
25042
25098
  }
25043
25099
 
25044
25100
  async fn process_document(
@@ -25586,11 +25642,17 @@ impl xberg::plugins::Plugin for RbPostProcessorBridge {
25586
25642
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
25587
25643
  Ok(v) => v,
25588
25644
  Err(e) => {
25589
- let _ = e;
25645
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25646
+ // propagate. Log before substituting the default — a silent default is
25647
+ // indistinguishable from a real result to the caller.
25648
+ eprintln!("[RbPostProcessorBridge] host 'version' raised; returning default: {e}");
25590
25649
  return Default::default();
25591
25650
  }
25592
25651
  };
25593
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25652
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25653
+ eprintln!("[RbPostProcessorBridge] host 'version' returned an unconvertible value; returning default: {e}");
25654
+ Default::default()
25655
+ })
25594
25656
  }
25595
25657
 
25596
25658
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -25702,7 +25764,10 @@ impl xberg::PostProcessor for RbPostProcessorBridge {
25702
25764
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("processing_stage", ()) {
25703
25765
  Ok(v) => v,
25704
25766
  Err(e) => {
25705
- let _ = e;
25767
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25768
+ // propagate. Log before substituting the default — a silent default is
25769
+ // indistinguishable from a real result to the caller.
25770
+ eprintln!("[RbPostProcessorBridge] host 'processing_stage' raised; returning default: {e}");
25706
25771
  return Default::default();
25707
25772
  }
25708
25773
  };
@@ -25712,12 +25777,19 @@ impl xberg::PostProcessor for RbPostProcessorBridge {
25712
25777
  match val.funcall::<_, _, String>("to_json", ()) {
25713
25778
  Ok(s) => s,
25714
25779
  Err(e) => {
25715
- let _ = e;
25780
+ eprintln!(
25781
+ "[RbPostProcessorBridge] host 'processing_stage' returned a non-JSON value; returning default: {e}"
25782
+ );
25716
25783
  return Default::default();
25717
25784
  }
25718
25785
  }
25719
25786
  };
25720
- serde_json::from_str::<xberg::ProcessingStage>(&json_str).unwrap_or_default()
25787
+ serde_json::from_str::<xberg::ProcessingStage>(&json_str).unwrap_or_else(|e| {
25788
+ eprintln!(
25789
+ "[RbPostProcessorBridge] host 'processing_stage' returned an unparseable value; returning default: {e}"
25790
+ );
25791
+ Default::default()
25792
+ })
25721
25793
  }
25722
25794
 
25723
25795
  fn should_process(&self, _result: &xberg::ExtractedDocument, _config: &xberg::ExtractionConfig) -> bool {
@@ -25744,11 +25816,19 @@ impl xberg::PostProcessor for RbPostProcessorBridge {
25744
25816
  ) {
25745
25817
  Ok(v) => v,
25746
25818
  Err(e) => {
25747
- let _ = e;
25819
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25820
+ // propagate. Log before substituting the default — a silent default is
25821
+ // indistinguishable from a real result to the caller.
25822
+ eprintln!("[RbPostProcessorBridge] host 'should_process' raised; returning default: {e}");
25748
25823
  return Default::default();
25749
25824
  }
25750
25825
  };
25751
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25826
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25827
+ eprintln!(
25828
+ "[RbPostProcessorBridge] host 'should_process' returned an unconvertible value; returning default: {e}"
25829
+ );
25830
+ Default::default()
25831
+ })
25752
25832
  }
25753
25833
 
25754
25834
  fn estimated_duration_ms(&self, _result: &xberg::ExtractedDocument) -> u64 {
@@ -25768,11 +25848,17 @@ impl xberg::PostProcessor for RbPostProcessorBridge {
25768
25848
  ) {
25769
25849
  Ok(v) => v,
25770
25850
  Err(e) => {
25771
- let _ = e;
25851
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25852
+ // propagate. Log before substituting the default — a silent default is
25853
+ // indistinguishable from a real result to the caller.
25854
+ eprintln!("[RbPostProcessorBridge] host 'estimated_duration_ms' raised; returning default: {e}");
25772
25855
  return Default::default();
25773
25856
  }
25774
25857
  };
25775
- <u64 as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25858
+ <u64 as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25859
+ eprintln!("[RbPostProcessorBridge] host 'estimated_duration_ms' returned an unconvertible value; returning default: {e}");
25860
+ Default::default()
25861
+ })
25776
25862
  }
25777
25863
 
25778
25864
  fn priority(&self) -> i32 {
@@ -25785,11 +25871,19 @@ impl xberg::PostProcessor for RbPostProcessorBridge {
25785
25871
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("priority", ()) {
25786
25872
  Ok(v) => v,
25787
25873
  Err(e) => {
25788
- let _ = e;
25874
+ // This method's Rust signature is infallible, so a Ruby exception cannot
25875
+ // propagate. Log before substituting the default — a silent default is
25876
+ // indistinguishable from a real result to the caller.
25877
+ eprintln!("[RbPostProcessorBridge] host 'priority' raised; returning default: {e}");
25789
25878
  return Default::default();
25790
25879
  }
25791
25880
  };
25792
- <i32 as magnus::TryConvert>::try_convert(val).unwrap_or_default()
25881
+ <i32 as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
25882
+ eprintln!(
25883
+ "[RbPostProcessorBridge] host 'priority' returned an unconvertible value; returning default: {e}"
25884
+ );
25885
+ Default::default()
25886
+ })
25793
25887
  }
25794
25888
  }
25795
25889
 
@@ -26011,11 +26105,17 @@ impl xberg::plugins::Plugin for RbValidatorBridge {
26011
26105
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
26012
26106
  Ok(v) => v,
26013
26107
  Err(e) => {
26014
- let _ = e;
26108
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26109
+ // propagate. Log before substituting the default — a silent default is
26110
+ // indistinguishable from a real result to the caller.
26111
+ eprintln!("[RbValidatorBridge] host 'version' raised; returning default: {e}");
26015
26112
  return Default::default();
26016
26113
  }
26017
26114
  };
26018
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26115
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26116
+ eprintln!("[RbValidatorBridge] host 'version' returned an unconvertible value; returning default: {e}");
26117
+ Default::default()
26118
+ })
26019
26119
  }
26020
26120
 
26021
26121
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -26144,11 +26244,19 @@ impl xberg::Validator for RbValidatorBridge {
26144
26244
  ) {
26145
26245
  Ok(v) => v,
26146
26246
  Err(e) => {
26147
- let _ = e;
26247
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26248
+ // propagate. Log before substituting the default — a silent default is
26249
+ // indistinguishable from a real result to the caller.
26250
+ eprintln!("[RbValidatorBridge] host 'should_validate' raised; returning default: {e}");
26148
26251
  return Default::default();
26149
26252
  }
26150
26253
  };
26151
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26254
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26255
+ eprintln!(
26256
+ "[RbValidatorBridge] host 'should_validate' returned an unconvertible value; returning default: {e}"
26257
+ );
26258
+ Default::default()
26259
+ })
26152
26260
  }
26153
26261
 
26154
26262
  fn priority(&self) -> i32 {
@@ -26161,11 +26269,17 @@ impl xberg::Validator for RbValidatorBridge {
26161
26269
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("priority", ()) {
26162
26270
  Ok(v) => v,
26163
26271
  Err(e) => {
26164
- let _ = e;
26272
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26273
+ // propagate. Log before substituting the default — a silent default is
26274
+ // indistinguishable from a real result to the caller.
26275
+ eprintln!("[RbValidatorBridge] host 'priority' raised; returning default: {e}");
26165
26276
  return Default::default();
26166
26277
  }
26167
26278
  };
26168
- <i32 as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26279
+ <i32 as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26280
+ eprintln!("[RbValidatorBridge] host 'priority' returned an unconvertible value; returning default: {e}");
26281
+ Default::default()
26282
+ })
26169
26283
  }
26170
26284
  }
26171
26285
 
@@ -26340,11 +26454,19 @@ impl xberg::plugins::Plugin for RbDocumentExtractorBridge {
26340
26454
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
26341
26455
  Ok(v) => v,
26342
26456
  Err(e) => {
26343
- let _ = e;
26457
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26458
+ // propagate. Log before substituting the default — a silent default is
26459
+ // indistinguishable from a real result to the caller.
26460
+ eprintln!("[RbDocumentExtractorBridge] host 'version' raised; returning default: {e}");
26344
26461
  return Default::default();
26345
26462
  }
26346
26463
  };
26347
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26464
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26465
+ eprintln!(
26466
+ "[RbDocumentExtractorBridge] host 'version' returned an unconvertible value; returning default: {e}"
26467
+ );
26468
+ Default::default()
26469
+ })
26348
26470
  }
26349
26471
 
26350
26472
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -26465,11 +26587,17 @@ impl xberg::DocumentExtractor for RbDocumentExtractorBridge {
26465
26587
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("supported_mime_types", ()) {
26466
26588
  Ok(v) => v,
26467
26589
  Err(e) => {
26468
- let _ = e;
26590
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26591
+ // propagate. Log before substituting the default — a silent default is
26592
+ // indistinguishable from a real result to the caller.
26593
+ eprintln!("[RbDocumentExtractorBridge] host 'supported_mime_types' raised; returning default: {e}");
26469
26594
  return Default::default();
26470
26595
  }
26471
26596
  };
26472
- <Vec<String> as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26597
+ <Vec<String> as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26598
+ eprintln!("[RbDocumentExtractorBridge] host 'supported_mime_types' returned an unconvertible value; returning default: {e}");
26599
+ Default::default()
26600
+ })
26473
26601
  };
26474
26602
  let __strs: Vec<&'static str> = __types
26475
26603
  .into_iter()
@@ -26488,11 +26616,19 @@ impl xberg::DocumentExtractor for RbDocumentExtractorBridge {
26488
26616
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("priority", ()) {
26489
26617
  Ok(v) => v,
26490
26618
  Err(e) => {
26491
- let _ = e;
26619
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26620
+ // propagate. Log before substituting the default — a silent default is
26621
+ // indistinguishable from a real result to the caller.
26622
+ eprintln!("[RbDocumentExtractorBridge] host 'priority' raised; returning default: {e}");
26492
26623
  return Default::default();
26493
26624
  }
26494
26625
  };
26495
- <i32 as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26626
+ <i32 as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26627
+ eprintln!(
26628
+ "[RbDocumentExtractorBridge] host 'priority' returned an unconvertible value; returning default: {e}"
26629
+ );
26630
+ Default::default()
26631
+ })
26496
26632
  }
26497
26633
 
26498
26634
  fn can_handle(&self, _path: &std::path::Path, _mime_type: &str) -> bool {
@@ -26518,11 +26654,19 @@ impl xberg::DocumentExtractor for RbDocumentExtractorBridge {
26518
26654
  ) {
26519
26655
  Ok(v) => v,
26520
26656
  Err(e) => {
26521
- let _ = e;
26657
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26658
+ // propagate. Log before substituting the default — a silent default is
26659
+ // indistinguishable from a real result to the caller.
26660
+ eprintln!("[RbDocumentExtractorBridge] host 'can_handle' raised; returning default: {e}");
26522
26661
  return Default::default();
26523
26662
  }
26524
26663
  };
26525
- <bool as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26664
+ <bool as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26665
+ eprintln!(
26666
+ "[RbDocumentExtractorBridge] host 'can_handle' returned an unconvertible value; returning default: {e}"
26667
+ );
26668
+ Default::default()
26669
+ })
26526
26670
  }
26527
26671
  }
26528
26672
 
@@ -26699,11 +26843,19 @@ impl xberg::plugins::Plugin for RbEmbeddingBackendBridge {
26699
26843
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
26700
26844
  Ok(v) => v,
26701
26845
  Err(e) => {
26702
- let _ = e;
26846
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26847
+ // propagate. Log before substituting the default — a silent default is
26848
+ // indistinguishable from a real result to the caller.
26849
+ eprintln!("[RbEmbeddingBackendBridge] host 'version' raised; returning default: {e}");
26703
26850
  return Default::default();
26704
26851
  }
26705
26852
  };
26706
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26853
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26854
+ eprintln!(
26855
+ "[RbEmbeddingBackendBridge] host 'version' returned an unconvertible value; returning default: {e}"
26856
+ );
26857
+ Default::default()
26858
+ })
26707
26859
  }
26708
26860
 
26709
26861
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -26756,11 +26908,19 @@ impl xberg::EmbeddingBackend for RbEmbeddingBackendBridge {
26756
26908
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("dimensions", ()) {
26757
26909
  Ok(v) => v,
26758
26910
  Err(e) => {
26759
- let _ = e;
26911
+ // This method's Rust signature is infallible, so a Ruby exception cannot
26912
+ // propagate. Log before substituting the default — a silent default is
26913
+ // indistinguishable from a real result to the caller.
26914
+ eprintln!("[RbEmbeddingBackendBridge] host 'dimensions' raised; returning default: {e}");
26760
26915
  return Default::default();
26761
26916
  }
26762
26917
  };
26763
- <usize as magnus::TryConvert>::try_convert(val).unwrap_or_default()
26918
+ <usize as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
26919
+ eprintln!(
26920
+ "[RbEmbeddingBackendBridge] host 'dimensions' returned an unconvertible value; returning default: {e}"
26921
+ );
26922
+ Default::default()
26923
+ })
26764
26924
  }
26765
26925
 
26766
26926
  async fn embed(&self, texts: Vec<String>) -> std::result::Result<Vec<Vec<f32>>, xberg::XbergError> {
@@ -26897,11 +27057,17 @@ impl xberg::plugins::Plugin for RbRendererBridge {
26897
27057
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
26898
27058
  Ok(v) => v,
26899
27059
  Err(e) => {
26900
- let _ = e;
27060
+ // This method's Rust signature is infallible, so a Ruby exception cannot
27061
+ // propagate. Log before substituting the default — a silent default is
27062
+ // indistinguishable from a real result to the caller.
27063
+ eprintln!("[RbRendererBridge] host 'version' raised; returning default: {e}");
26901
27064
  return Default::default();
26902
27065
  }
26903
27066
  };
26904
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
27067
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
27068
+ eprintln!("[RbRendererBridge] host 'version' returned an unconvertible value; returning default: {e}");
27069
+ Default::default()
27070
+ })
26905
27071
  }
26906
27072
 
26907
27073
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -27077,11 +27243,19 @@ impl xberg::plugins::Plugin for RbRerankerBackendBridge {
27077
27243
  let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
27078
27244
  Ok(v) => v,
27079
27245
  Err(e) => {
27080
- let _ = e;
27246
+ // This method's Rust signature is infallible, so a Ruby exception cannot
27247
+ // propagate. Log before substituting the default — a silent default is
27248
+ // indistinguishable from a real result to the caller.
27249
+ eprintln!("[RbRerankerBackendBridge] host 'version' raised; returning default: {e}");
27081
27250
  return Default::default();
27082
27251
  }
27083
27252
  };
27084
- <String as magnus::TryConvert>::try_convert(val).unwrap_or_default()
27253
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
27254
+ eprintln!(
27255
+ "[RbRerankerBackendBridge] host 'version' returned an unconvertible value; returning default: {e}"
27256
+ );
27257
+ Default::default()
27258
+ })
27085
27259
  }
27086
27260
 
27087
27261
  fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
@@ -27223,6 +27397,180 @@ pub fn clear_reranker_backends() -> Result<(), magnus::Error> {
27223
27397
  })
27224
27398
  }
27225
27399
 
27400
+ #[allow(unused_imports)]
27401
+ use magnus::TryConvert as _;
27402
+ #[allow(unused_imports)]
27403
+ use magnus::value::InnerValue as _;
27404
+ /// Wrapper that bridges a foreign Rb object to the `TokenizerBackend` trait.
27405
+ pub struct RbTokenizerBackendBridge {
27406
+ inner: magnus::value::Opaque<magnus::Value>,
27407
+ cached_name: String,
27408
+ has_initialize: bool,
27409
+ has_shutdown: bool,
27410
+ }
27411
+
27412
+ impl std::fmt::Debug for RbTokenizerBackendBridge {
27413
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27414
+ write!(f, "RbTokenizerBackendBridge")
27415
+ }
27416
+ }
27417
+
27418
+ impl RbTokenizerBackendBridge {
27419
+ /// Create a new bridge wrapping a Ruby object.
27420
+ /// Validates that the Ruby object responds to all required methods.
27421
+ pub fn new(rb_obj: magnus::Value, name: String) -> Result<Self, magnus::Error> {
27422
+ if !rb_obj.respond_to("count_tokens", false).unwrap_or(false) {
27423
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27424
+ return Err(magnus::Error::new(
27425
+ ruby.exception_runtime_error(),
27426
+ format!("Ruby object missing required method: {}", "count_tokens"),
27427
+ ));
27428
+ }
27429
+ Ok(Self {
27430
+ inner: magnus::value::Opaque::from(rb_obj),
27431
+ cached_name: name,
27432
+ has_initialize: rb_obj.respond_to("initialize", false).unwrap_or(false),
27433
+ has_shutdown: rb_obj.respond_to("shutdown", false).unwrap_or(false),
27434
+ })
27435
+ }
27436
+ }
27437
+
27438
+ impl xberg::plugins::Plugin for RbTokenizerBackendBridge {
27439
+ fn name(&self) -> &str {
27440
+ &self.cached_name
27441
+ }
27442
+
27443
+ fn version(&self) -> String {
27444
+ // SAFETY: bridge methods are only invoked from threads holding the GVL
27445
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27446
+ let value = self.inner.get_inner_with(&ruby);
27447
+ let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("version", ()) {
27448
+ Ok(v) => v,
27449
+ Err(e) => {
27450
+ // This method's Rust signature is infallible, so a Ruby exception cannot
27451
+ // propagate. Log before substituting the default — a silent default is
27452
+ // indistinguishable from a real result to the caller.
27453
+ eprintln!("[RbTokenizerBackendBridge] host 'version' raised; returning default: {e}");
27454
+ return Default::default();
27455
+ }
27456
+ };
27457
+ <String as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
27458
+ eprintln!(
27459
+ "[RbTokenizerBackendBridge] host 'version' returned an unconvertible value; returning default: {e}"
27460
+ );
27461
+ Default::default()
27462
+ })
27463
+ }
27464
+
27465
+ fn initialize(&self) -> std::result::Result<(), xberg::XbergError> {
27466
+ if !(self.has_initialize) {
27467
+ return Ok(());
27468
+ }
27469
+ // SAFETY: bridge methods are only invoked from threads holding the GVL
27470
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27471
+ let value = self.inner.get_inner_with(&ruby);
27472
+ let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("initialize", ()) {
27473
+ Ok(v) => v,
27474
+ Err(e) => {
27475
+ return Err(xberg::XbergError::Other(format!(
27476
+ "Ruby method 'initialize' failed: {}",
27477
+ e
27478
+ )));
27479
+ }
27480
+ };
27481
+ let _ = val;
27482
+ Ok(())
27483
+ }
27484
+
27485
+ fn shutdown(&self) -> std::result::Result<(), xberg::XbergError> {
27486
+ if !(self.has_shutdown) {
27487
+ return Ok(());
27488
+ }
27489
+ // SAFETY: bridge methods are only invoked from threads holding the GVL
27490
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27491
+ let value = self.inner.get_inner_with(&ruby);
27492
+ let val: magnus::Value = match value.funcall::<_, _, magnus::Value>("shutdown", ()) {
27493
+ Ok(v) => v,
27494
+ Err(e) => {
27495
+ return Err(xberg::XbergError::Other(format!(
27496
+ "Ruby method 'shutdown' failed: {}",
27497
+ e
27498
+ )));
27499
+ }
27500
+ };
27501
+ let _ = val;
27502
+ Ok(())
27503
+ }
27504
+ }
27505
+
27506
+ impl xberg::TokenizerBackend for RbTokenizerBackendBridge {
27507
+ fn count_tokens(&self, text: &str) -> usize {
27508
+ // SAFETY: bridge methods are only invoked from threads holding the GVL
27509
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27510
+ let value = self.inner.get_inner_with(&ruby);
27511
+ let val: magnus::Value = match value.funcall::<_, _, magnus::Value>(
27512
+ "count_tokens",
27513
+ ({
27514
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27515
+ ruby.str_new(AsRef::<str>::as_ref(&text)).as_value()
27516
+ },),
27517
+ ) {
27518
+ Ok(v) => v,
27519
+ Err(e) => {
27520
+ // This method's Rust signature is infallible, so a Ruby exception cannot
27521
+ // propagate. Log before substituting the default — a silent default is
27522
+ // indistinguishable from a real result to the caller.
27523
+ eprintln!("[RbTokenizerBackendBridge] host 'count_tokens' raised; returning default: {e}");
27524
+ return Default::default();
27525
+ }
27526
+ };
27527
+ <usize as magnus::TryConvert>::try_convert(val).unwrap_or_else(|e| {
27528
+ eprintln!(
27529
+ "[RbTokenizerBackendBridge] host 'count_tokens' returned an unconvertible value; returning default: {e}"
27530
+ );
27531
+ Default::default()
27532
+ })
27533
+ }
27534
+ }
27535
+
27536
+ pub fn register_tokenizer_backend(rb_obj: magnus::Value, name: String) -> Result<(), magnus::Error> {
27537
+ let required_methods = ["count_tokens"];
27538
+ for method in &required_methods {
27539
+ if !rb_obj.respond_to(*method, false).unwrap_or(false) {
27540
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27541
+ return Err(magnus::Error::new(
27542
+ ruby.exception_runtime_error(),
27543
+ format!("Backend missing required method: {}", method),
27544
+ ));
27545
+ }
27546
+ }
27547
+ let wrapper = RbTokenizerBackendBridge::new(rb_obj, name)?;
27548
+ let arc: Arc<dyn xberg::TokenizerBackend> = Arc::new(wrapper);
27549
+
27550
+ xberg::plugins::registry::get_tokenizer_backend_registry()
27551
+ .write()
27552
+ .register(arc)
27553
+ .map_err(|e| {
27554
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27555
+ magnus::Error::new(ruby.exception_runtime_error(), format!("register failed: {}", e))
27556
+ })?;
27557
+ Ok(())
27558
+ }
27559
+
27560
+ pub fn unregister_tokenizer_backend(name: String) -> Result<(), magnus::Error> {
27561
+ xberg::plugins::tokenizer_backend::unregister_tokenizer_backend(&name).map_err(|e| {
27562
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27563
+ magnus::Error::new(ruby.exception_runtime_error(), format!("{}", e))
27564
+ })
27565
+ }
27566
+
27567
+ pub fn clear_tokenizer_backends() -> Result<(), magnus::Error> {
27568
+ xberg::plugins::tokenizer_backend::clear_tokenizer_backends().map_err(|e| {
27569
+ let ruby = unsafe { magnus::Ruby::get_unchecked() };
27570
+ magnus::Error::new(ruby.exception_runtime_error(), format!("{}", e))
27571
+ })
27572
+ }
27573
+
27226
27574
  #[allow(clippy::redundant_closure, clippy::useless_conversion)]
27227
27575
  impl From<xberg::CacheStats> for CacheStats {
27228
27576
  fn from(val: xberg::CacheStats) -> Self {
@@ -37503,6 +37851,8 @@ fn ruby_init(ruby: &Ruby) -> Result<(), Error> {
37503
37851
 
37504
37852
  module.define_module_function("list_reranker_backends", function!(list_reranker_backends, 0))?;
37505
37853
 
37854
+ module.define_module_function("list_tokenizer_backends", function!(list_tokenizer_backends, 0))?;
37855
+
37506
37856
  module.define_module_function("list_validators", function!(list_validators, 0))?;
37507
37857
 
37508
37858
  module.define_module_function("find_unmarked_claims", function!(find_unmarked_claims, 1))?;
@@ -37557,5 +37907,14 @@ fn ruby_init(ruby: &Ruby) -> Result<(), Error> {
37557
37907
 
37558
37908
  module.define_module_function("clear_reranker_backends", function!(clear_reranker_backends, 0))?;
37559
37909
 
37910
+ module.define_module_function("register_tokenizer_backend", function!(register_tokenizer_backend, 2))?;
37911
+
37912
+ module.define_module_function(
37913
+ "unregister_tokenizer_backend",
37914
+ function!(unregister_tokenizer_backend, 1),
37915
+ )?;
37916
+
37917
+ module.define_module_function("clear_tokenizer_backends", function!(clear_tokenizer_backends, 0))?;
37918
+
37560
37919
  Ok(())
37561
37920
  }
data/lib/xberg/native.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # This file is auto-generated by alef — DO NOT EDIT.
2
- # alef:hash:0ce3ea7bbabccafc622b4dd87ac0f00356dd0426ec66977c856525dabafdc585
2
+ # alef:hash:28933e85bc9dc440d3d48a0fa997a78b13df863b6249812908ba7914441b9232
3
3
  # To regenerate: alef generate
4
4
  # To verify freshness: alef verify --exit-code
5
5
  # frozen_string_literal: true
@@ -351,9 +351,12 @@ module Xberg
351
351
  # Defaults to `Characters` (Unicode character count). When using token-based sizing,
352
352
  # chunks are sized by token count according to the specified tokenizer.
353
353
  #
354
- # Token-based sizing uses HuggingFace tokenizers loaded at runtime. Any tokenizer
355
- # available on HuggingFace Hub can be used, including OpenAI-compatible tokenizers
356
- # (e.g., `Xenova/gpt-4o`, `Xenova/cl100k_base`).
354
+ # Token-based sizing uses HuggingFace tokenizers loaded at runtime, or a tokenizer
355
+ # backend you register yourself. Any tokenizer available on HuggingFace Hub can be
356
+ # used, including OpenAI-compatible tokenizers (e.g., `Xenova/gpt-4o`,
357
+ # `Xenova/cl100k_base`). To size chunks with your own tokenizer instead (llama.cpp/GGUF
358
+ # vocabularies, SentencePiece models, custom vocabs), register a `TokenizerBackend`
359
+ # with `register_tokenizer_backend` and set `model` to the registered name.
357
360
  module ChunkSizing
358
361
  extend T::Helpers
359
362
  extend T::Sig
@@ -392,12 +395,15 @@ module Xberg
392
395
  new
393
396
  end
394
397
  end
395
- ## Size measured in tokens from a HuggingFace tokenizer.
398
+ ## Size measured in tokens from a HuggingFace tokenizer or a registered
399
+ ## tokenizer backend.
396
400
  ChunkSizingTokenizer = Data.define(:model, :cache_dir) do
397
401
  include ChunkSizing
398
402
  extend T::Sig
399
403
 
400
- # HuggingFace model ID or path, e.g. "Xenova/gpt-4o", "bert-base-uncased".
404
+ # Name of a tokenizer backend registered via `register_tokenizer_backend`,
405
+ # or a HuggingFace model ID, e.g. "Xenova/gpt-4o", "bert-base-uncased".
406
+ # A registered backend name takes precedence over a HuggingFace ID.
401
407
  sig { returns(String) }
402
408
  # rubocop:disable Lint/UselessMethodDefinition
403
409
  def model = super
data/lib/xberg/version.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  # This file is auto-generated by alef — DO NOT EDIT.
2
- # alef:hash:0ce3ea7bbabccafc622b4dd87ac0f00356dd0426ec66977c856525dabafdc585
2
+ # alef:hash:28933e85bc9dc440d3d48a0fa997a78b13df863b6249812908ba7914441b9232
3
3
  # To regenerate: alef generate
4
4
  # To verify freshness: alef verify --exit-code
5
5
  # frozen_string_literal: true
6
6
 
7
7
  module Xberg
8
8
  ## The version string for this package.
9
- VERSION = "1.0.0.pre.rc.7"
9
+ VERSION = "1.0.0.pre.rc.9"
10
10
  end
data/lib/xberg.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # This file is auto-generated by alef — DO NOT EDIT.
2
- # alef:hash:0ce3ea7bbabccafc622b4dd87ac0f00356dd0426ec66977c856525dabafdc585
2
+ # alef:hash:28933e85bc9dc440d3d48a0fa997a78b13df863b6249812908ba7914441b9232
3
3
  # To regenerate: alef generate
4
4
  # To verify freshness: alef verify --exit-code
5
5
  # frozen_string_literal: true
data/lib/xberg_rb.so CHANGED
Binary file
data/sig/types.rbs CHANGED
@@ -1,5 +1,5 @@
1
1
  # This file is auto-generated by alef — DO NOT EDIT.
2
- # alef:hash:0ce3ea7bbabccafc622b4dd87ac0f00356dd0426ec66977c856525dabafdc585
2
+ # alef:hash:28933e85bc9dc440d3d48a0fa997a78b13df863b6249812908ba7914441b9232
3
3
  # To regenerate: alef generate
4
4
  # To verify freshness: alef verify --exit-code
5
5
 
@@ -2483,6 +2483,10 @@ def self.clear_reranker_backends: () -> void
2483
2483
 
2484
2484
  def self.list_reranker_backends: () -> Array[String]
2485
2485
 
2486
+ def self.clear_tokenizer_backends: () -> void
2487
+
2488
+ def self.list_tokenizer_backends: () -> Array[String]
2489
+
2486
2490
  def self.list_validators: () -> Array[String]
2487
2491
 
2488
2492
  def self.clear_validators: () -> void
@@ -2543,6 +2547,10 @@ def embed: (Array[String] texts) -> Array[Array[Float]]
2543
2547
  def rerank: (String query, Array[String] documents) -> Array[Float]
2544
2548
  end
2545
2549
 
2550
+ interface _TokenizerBackend
2551
+ def count_tokens: (String text) -> Integer
2552
+ end
2553
+
2546
2554
  def self.register_ocr_backend: (_OcrBackend backend, String name) -> nil
2547
2555
 
2548
2556
  def self.unregister_ocr_backend: (String name) -> nil
@@ -2563,4 +2571,8 @@ def self.register_reranker_backend: (_RerankerBackend backend, String name) -> n
2563
2571
 
2564
2572
  def self.unregister_reranker_backend: (String name) -> nil
2565
2573
 
2574
+ def self.register_tokenizer_backend: (_TokenizerBackend backend, String name) -> nil
2575
+
2576
+ def self.unregister_tokenizer_backend: (String name) -> nil
2577
+
2566
2578
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xberg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.rc.7
4
+ version: 1.0.0.pre.rc.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Na'aman Hirschfeld <naaman@xberg.io>
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-04 00:00:00.000000000 Z
11
+ date: 2026-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb_sys