lingua_rs 0.4.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +59 -37
- data/Rakefile +6 -0
- data/ext/lingua/src/detector.rs +71 -0
- data/lib/lingua/version.rb +1 -1
- metadata +2 -3
- data/ext/lingua/Cargo.lock +0 -289
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ec0e0ba5844b9b3e47cd60babbc90ac03791bc83e3327e78b7f2d83ba4a71d8
|
|
4
|
+
data.tar.gz: 55af5915e63a1b34cbc5c73d2e2c63b6a1ce2030183112c54aad888b299bc889
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b6bfc5d1605bf171e7be4dd899e7b82460f4c8b81ab541ff97a18fb59205a752e9cfe12de640c20b6a60a4814bc8e89e884b9d501a2ec3b5a4e4f0b4bc2e094d
|
|
7
|
+
data.tar.gz: ecf2866f980b9ddd7189d639ea1330a4f47f8f0a528dcb636358c7c6de30add2d8a854cee8252eac36540fc528b1836eedebbd03313eeb1de167cd18c241afbf
|
data/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://rubygems.org/gems/lingua_rs)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Native Ruby bindings for the [Lingua](https://github.com/pemistahl/lingua-rs) Rust library, bringing highly accurate language detection for short text and mixed-language text, with confidence scores and ISO 639-1/639-3 language codes.
|
|
9
9
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
@@ -25,12 +25,7 @@ Then run `bundle install`.
|
|
|
25
25
|
|
|
26
26
|
### Build requirements
|
|
27
27
|
|
|
28
|
-
A Rust toolchain is required to compile the native extension.
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
export LIBCLANG_PATH=/usr/lib/llvm21/lib
|
|
32
|
-
export PATH=/usr/lib/llvm21/bin:$PATH
|
|
33
|
-
```
|
|
28
|
+
A Rust toolchain is required to compile the native extension.
|
|
34
29
|
|
|
35
30
|
## Usage
|
|
36
31
|
|
|
@@ -71,8 +66,6 @@ Lingua.detect('Bonjour', languages: %w[en french deu])
|
|
|
71
66
|
|
|
72
67
|
### Options
|
|
73
68
|
|
|
74
|
-
All options accept both symbol and string keys.
|
|
75
|
-
|
|
76
69
|
| Option | Type | Description |
|
|
77
70
|
|---|---|---|
|
|
78
71
|
| `languages` | `Array<String>` | Restrict detection to these languages (names, ISO 639-1 or ISO 639-3 codes) |
|
|
@@ -137,7 +130,52 @@ detector = Lingua::Detector.new(languages: %w[en fr de])
|
|
|
137
130
|
detector.detect_multiple(text)
|
|
138
131
|
```
|
|
139
132
|
|
|
140
|
-
###
|
|
133
|
+
### Parallel batch detection
|
|
134
|
+
|
|
135
|
+
`Lingua::Detector` provides batch methods that process multiple texts in parallel using [Rayon](https://github.com/rayon-rs/rayon). These are significantly faster than calling single-text methods in a loop.
|
|
136
|
+
|
|
137
|
+
```ruby
|
|
138
|
+
detector = Lingua::Detector.new(languages: %w[en fr de])
|
|
139
|
+
|
|
140
|
+
# Detect language of multiple texts
|
|
141
|
+
detector.detect_batch(['Bonjour le monde', 'Hello world', 'Hallo Welt'])
|
|
142
|
+
# => [#<Lingua::Language French>, #<Lingua::Language English>, #<Lingua::Language German>]
|
|
143
|
+
|
|
144
|
+
# Confidence for a specific language across multiple texts
|
|
145
|
+
detector.confidence_batch(['Bonjour le monde', 'Hello world'], :fr)
|
|
146
|
+
# => [0.8217, 0.0215]
|
|
147
|
+
|
|
148
|
+
# Confidence values for multiple texts
|
|
149
|
+
detector.confidence_values_batch(['Bonjour le monde', 'Hello world'])
|
|
150
|
+
# => [[#<Lingua::ConfidenceResult French (0.82)>, ...], [#<Lingua::ConfidenceResult English (0.91)>, ...]]
|
|
151
|
+
|
|
152
|
+
# Mixed-language detection on multiple texts
|
|
153
|
+
detector.detect_multiple_batch(['Bonjour le monde. Hello world.', 'Ich bin müde. Salut tout le monde.'])
|
|
154
|
+
# => [[#<Lingua::Segment French ...>, #<Lingua::Segment English ...>], [#<Lingua::Segment German ...>, #<Lingua::Segment French ...>]]
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
| Method | Return type | Description |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| `detect_batch(texts)` | `Array<Language\|nil>` | Detect language of each text |
|
|
160
|
+
| `detect_multiple_batch(texts)` | `Array<Array<Segment>>` | Mixed-language detection for each text |
|
|
161
|
+
| `confidence_values_batch(texts)` | `Array<Array<ConfidenceResult>>` | Confidence values for each text |
|
|
162
|
+
| `confidence_batch(texts, language)` | `Array<Float>` | Confidence for a specific language across texts |
|
|
163
|
+
|
|
164
|
+
### Error handling
|
|
165
|
+
|
|
166
|
+
`Lingua::UnknownLanguageError` (subclass of `ArgumentError`) is raised when an unrecognized language name or code is passed:
|
|
167
|
+
|
|
168
|
+
```ruby
|
|
169
|
+
begin
|
|
170
|
+
Lingua.detect('Hello', languages: %w[en zzzz])
|
|
171
|
+
rescue Lingua::UnknownLanguageError => e
|
|
172
|
+
puts e.message # => unknown language: "zzzz"
|
|
173
|
+
end
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## API Reference
|
|
177
|
+
|
|
178
|
+
### `Lingua::Language`
|
|
141
179
|
|
|
142
180
|
`Lingua::Language` objects support equality (`==`) and can be used as Hash keys. You can look up a language by name, ISO 639-1 code, or ISO 639-3 code using `[]`:
|
|
143
181
|
|
|
@@ -148,6 +186,12 @@ Lingua::Language['fra'] # => #<Lingua::Language French>
|
|
|
148
186
|
Lingua::Language['xxx'] # => nil
|
|
149
187
|
```
|
|
150
188
|
|
|
189
|
+
| Method | Return type | Description |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| `Lingua::Language.all` | `Array<Lingua::Language>` | All supported languages |
|
|
192
|
+
| `Lingua::Language.names` | `Array<String>` | All language names (e.g. `'French'`) |
|
|
193
|
+
| `Lingua::Language.iso_codes` | `Array<String>` | All ISO 639-1 codes (e.g. `'fr'`) |
|
|
194
|
+
|
|
151
195
|
| Method | Return type | Example |
|
|
152
196
|
|---|---|---|
|
|
153
197
|
| `name` | `String` | `'French'` |
|
|
@@ -157,20 +201,12 @@ Lingua::Language['xxx'] # => nil
|
|
|
157
201
|
| `to_iso` | `String` | `'fr'` (alias for `to_iso6391`) |
|
|
158
202
|
| `to_iso6391` | `String` | `'fr'` |
|
|
159
203
|
| `to_iso6393` | `String` | `'fra'` |
|
|
160
|
-
|
|
|
204
|
+
| `<name>?` | `Boolean` | Dynamic predicate for any language (`french?`, `fr?`, `fra?`) |
|
|
161
205
|
| `inspect` | `String` | `'#<Lingua::Language French>'` |
|
|
162
206
|
| `==` | `Boolean` | Compare two languages |
|
|
163
207
|
| `hash` | `Integer` | Hash value (usable as Hash key) |
|
|
164
208
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
| Method | Return type | Description |
|
|
168
|
-
|---|---|---|
|
|
169
|
-
| `Lingua::Language.all` | `Array<Lingua::Language>` | All supported languages |
|
|
170
|
-
| `Lingua::Language.names` | `Array<String>` | All language names (e.g. `'French'`) |
|
|
171
|
-
| `Lingua::Language.iso_codes` | `Array<String>` | All ISO 639-1 codes (e.g. `'fr'`) |
|
|
172
|
-
|
|
173
|
-
### `Lingua::ConfidenceResult` methods
|
|
209
|
+
### `Lingua::ConfidenceResult`
|
|
174
210
|
|
|
175
211
|
Returned by `confidence_values`.
|
|
176
212
|
|
|
@@ -181,7 +217,7 @@ Returned by `confidence_values`.
|
|
|
181
217
|
| `to_s` | `String` | `'French (0.82)'` |
|
|
182
218
|
| `inspect` | `String` | `'#<Lingua::ConfidenceResult French (0.8217)>'` |
|
|
183
219
|
|
|
184
|
-
### `Lingua::Segment`
|
|
220
|
+
### `Lingua::Segment`
|
|
185
221
|
|
|
186
222
|
Returned by `detect_multiple`.
|
|
187
223
|
|
|
@@ -195,22 +231,6 @@ Returned by `detect_multiple`.
|
|
|
195
231
|
| `to_s` | `String` | `'French (0-22): Parlez-vous français? '` |
|
|
196
232
|
| `inspect` | `String` | `'#<Lingua::Segment French (0-22) "Parlez-vous français? ">'` |
|
|
197
233
|
|
|
198
|
-
### Error handling
|
|
199
|
-
|
|
200
|
-
`Lingua::UnknownLanguageError` (subclass of `ArgumentError`) is raised when an unrecognized language name or code is passed:
|
|
201
|
-
|
|
202
|
-
```ruby
|
|
203
|
-
Lingua.detect('Hello', languages: %w[en zzzz])
|
|
204
|
-
# => Lingua::UnknownLanguageError: unknown language: "zzzz"
|
|
205
|
-
|
|
206
|
-
# Can also be rescued as ArgumentError
|
|
207
|
-
begin
|
|
208
|
-
Lingua.detect('Hello', languages: %w[zzzz])
|
|
209
|
-
rescue ArgumentError => e
|
|
210
|
-
puts e.message
|
|
211
|
-
end
|
|
212
|
-
```
|
|
213
|
-
|
|
214
234
|
## Optimization: selecting languages
|
|
215
235
|
|
|
216
236
|
By default, all 75 languages are compiled into the native extension (~278 MB). If you only need a subset, select languages at build time to reduce binary size and improve detection speed.
|
|
@@ -277,6 +297,8 @@ Supported languages (from [Lingua Rust's official list](https://github.com/pemis
|
|
|
277
297
|
|
|
278
298
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake compile` to build the native extension and `rake test` to run the tests.
|
|
279
299
|
|
|
300
|
+
To run benchmarks (sequential vs batch performance comparison): `rake bench`
|
|
301
|
+
|
|
280
302
|
## Acknowledgements
|
|
281
303
|
|
|
282
304
|
This gem is built on top of [Lingua](https://github.com/pemistahl/lingua-rs) by [Peter M. Stahl](https://github.com/pemistahl), a highly accurate natural language detection library written in Rust.
|
data/Rakefile
CHANGED
|
@@ -19,4 +19,10 @@ RbSys::ExtensionTask.new('lingua', GEMSPEC) do |ext|
|
|
|
19
19
|
ext.lib_dir = 'lib/lingua'
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
desc 'Run benchmarks (sequential vs batch)'
|
|
23
|
+
task bench: :compile do
|
|
24
|
+
ENV['BENCH'] = '1'
|
|
25
|
+
ruby '-Itest', 'test/test_benchmark.rb'
|
|
26
|
+
end
|
|
27
|
+
|
|
22
28
|
task default: %i[compile test rubocop]
|
data/ext/lingua/src/detector.rs
CHANGED
|
@@ -13,6 +13,10 @@ pub fn define(ruby: &Ruby, module: &RModule) -> Result<(), Error> {
|
|
|
13
13
|
class.define_method("confidence", method!(RubyDetector::confidence, 2))?;
|
|
14
14
|
class.define_method("confidence_values", method!(RubyDetector::confidence_values, 1))?;
|
|
15
15
|
class.define_method("detect_multiple", method!(RubyDetector::detect_multiple, 1))?;
|
|
16
|
+
class.define_method("detect_batch", method!(RubyDetector::detect_batch, 1))?;
|
|
17
|
+
class.define_method("detect_multiple_batch", method!(RubyDetector::detect_multiple_batch, 1))?;
|
|
18
|
+
class.define_method("confidence_values_batch", method!(RubyDetector::confidence_values_batch, 1))?;
|
|
19
|
+
class.define_method("confidence_batch", method!(RubyDetector::confidence_batch, 2))?;
|
|
16
20
|
Ok(())
|
|
17
21
|
}
|
|
18
22
|
|
|
@@ -81,6 +85,73 @@ impl RubyDetector {
|
|
|
81
85
|
pub fn detect_multiple(&self, subject: String) -> Result<RArray, Error> {
|
|
82
86
|
compute_detect_multiple(&self.detector, &subject)
|
|
83
87
|
}
|
|
88
|
+
|
|
89
|
+
pub fn detect_batch(&self, texts: Vec<String>) -> Result<RArray, Error> {
|
|
90
|
+
let ruby = Ruby::get().unwrap();
|
|
91
|
+
let results = self.detector.detect_languages_in_parallel_of(&texts);
|
|
92
|
+
let array = ruby.ary_new_capa(results.len());
|
|
93
|
+
for result in results {
|
|
94
|
+
array.push(result.map(WrappedLanguage))?;
|
|
95
|
+
}
|
|
96
|
+
Ok(array)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
pub fn detect_multiple_batch(&self, texts: Vec<String>) -> Result<RArray, Error> {
|
|
100
|
+
let ruby = Ruby::get().unwrap();
|
|
101
|
+
let results = self.detector.detect_multiple_languages_in_parallel_of(&texts);
|
|
102
|
+
let outer = ruby.ary_new_capa(results.len());
|
|
103
|
+
for (detection_results, subject) in results.iter().zip(texts.iter()) {
|
|
104
|
+
let inner = ruby.ary_new_capa(detection_results.len());
|
|
105
|
+
for r in detection_results {
|
|
106
|
+
let text = subject[r.start_index()..r.end_index()].to_string();
|
|
107
|
+
let start_index = subject[..r.start_index()].chars().count();
|
|
108
|
+
let end_index = start_index + text.chars().count();
|
|
109
|
+
inner.push(Segment {
|
|
110
|
+
language: r.language(),
|
|
111
|
+
start_index,
|
|
112
|
+
end_index,
|
|
113
|
+
word_count: r.word_count(),
|
|
114
|
+
text,
|
|
115
|
+
})?;
|
|
116
|
+
}
|
|
117
|
+
outer.push(inner)?;
|
|
118
|
+
}
|
|
119
|
+
Ok(outer)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
pub fn confidence_values_batch(&self, texts: Vec<String>) -> Result<RArray, Error> {
|
|
123
|
+
let ruby = Ruby::get().unwrap();
|
|
124
|
+
let results = self.detector.compute_language_confidence_values_in_parallel(&texts);
|
|
125
|
+
let outer = ruby.ary_new_capa(results.len());
|
|
126
|
+
for values in results {
|
|
127
|
+
let inner = ruby.ary_new_capa(values.len());
|
|
128
|
+
for (language, confidence) in values {
|
|
129
|
+
inner.push(ConfidenceResult {
|
|
130
|
+
language,
|
|
131
|
+
confidence,
|
|
132
|
+
})?;
|
|
133
|
+
}
|
|
134
|
+
outer.push(inner)?;
|
|
135
|
+
}
|
|
136
|
+
Ok(outer)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
pub fn confidence_batch(&self, texts: Vec<String>, language: magnus::Value) -> Result<RArray, Error> {
|
|
140
|
+
let ruby = Ruby::get().unwrap();
|
|
141
|
+
let language_str = value_to_string(language)?;
|
|
142
|
+
let lang = parse_language(&language_str).ok_or_else(|| {
|
|
143
|
+
Error::new(
|
|
144
|
+
unknown_language_error(&ruby),
|
|
145
|
+
format!("unknown language: \"{language_str}\""),
|
|
146
|
+
)
|
|
147
|
+
})?;
|
|
148
|
+
let results = self.detector.compute_language_confidence_in_parallel(&texts, lang);
|
|
149
|
+
let array = ruby.ary_new_capa(results.len());
|
|
150
|
+
for score in results {
|
|
151
|
+
array.push(score)?;
|
|
152
|
+
}
|
|
153
|
+
Ok(array)
|
|
154
|
+
}
|
|
84
155
|
}
|
|
85
156
|
|
|
86
157
|
pub fn compute_detect_multiple(
|
data/lib/lingua/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lingua_rs
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sébastien Vrillaud
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-04-
|
|
10
|
+
date: 2026-04-08 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: rb_sys
|
|
@@ -50,7 +50,6 @@ files:
|
|
|
50
50
|
- LICENSE.txt
|
|
51
51
|
- README.md
|
|
52
52
|
- Rakefile
|
|
53
|
-
- ext/lingua/Cargo.lock
|
|
54
53
|
- ext/lingua/Cargo.toml
|
|
55
54
|
- ext/lingua/extconf.rb
|
|
56
55
|
- ext/lingua/src/confidence_result.rs
|
data/ext/lingua/Cargo.lock
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
# This file is automatically @generated by Cargo.
|
|
2
|
-
# It is not intended for manual editing.
|
|
3
|
-
version = 4
|
|
4
|
-
|
|
5
|
-
[[package]]
|
|
6
|
-
name = "aho-corasick"
|
|
7
|
-
version = "1.1.4"
|
|
8
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
-
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
|
|
10
|
-
dependencies = [
|
|
11
|
-
"memchr",
|
|
12
|
-
]
|
|
13
|
-
|
|
14
|
-
[[package]]
|
|
15
|
-
name = "bindgen"
|
|
16
|
-
version = "0.69.5"
|
|
17
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
18
|
-
checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
|
|
19
|
-
dependencies = [
|
|
20
|
-
"bitflags",
|
|
21
|
-
"cexpr",
|
|
22
|
-
"clang-sys",
|
|
23
|
-
"itertools",
|
|
24
|
-
"lazy_static",
|
|
25
|
-
"lazycell",
|
|
26
|
-
"proc-macro2",
|
|
27
|
-
"quote",
|
|
28
|
-
"regex",
|
|
29
|
-
"rustc-hash",
|
|
30
|
-
"shlex",
|
|
31
|
-
"syn",
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
[[package]]
|
|
35
|
-
name = "bitflags"
|
|
36
|
-
version = "2.11.0"
|
|
37
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
38
|
-
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
|
|
39
|
-
|
|
40
|
-
[[package]]
|
|
41
|
-
name = "cexpr"
|
|
42
|
-
version = "0.6.0"
|
|
43
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
44
|
-
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
|
|
45
|
-
dependencies = [
|
|
46
|
-
"nom",
|
|
47
|
-
]
|
|
48
|
-
|
|
49
|
-
[[package]]
|
|
50
|
-
name = "cfg-if"
|
|
51
|
-
version = "1.0.4"
|
|
52
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
53
|
-
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
54
|
-
|
|
55
|
-
[[package]]
|
|
56
|
-
name = "clang-sys"
|
|
57
|
-
version = "1.8.1"
|
|
58
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
59
|
-
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
|
|
60
|
-
dependencies = [
|
|
61
|
-
"glob",
|
|
62
|
-
"libc",
|
|
63
|
-
"libloading",
|
|
64
|
-
]
|
|
65
|
-
|
|
66
|
-
[[package]]
|
|
67
|
-
name = "either"
|
|
68
|
-
version = "1.15.0"
|
|
69
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
70
|
-
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
|
71
|
-
|
|
72
|
-
[[package]]
|
|
73
|
-
name = "glob"
|
|
74
|
-
version = "0.3.3"
|
|
75
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
76
|
-
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
|
|
77
|
-
|
|
78
|
-
[[package]]
|
|
79
|
-
name = "itertools"
|
|
80
|
-
version = "0.12.1"
|
|
81
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
82
|
-
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
|
|
83
|
-
dependencies = [
|
|
84
|
-
"either",
|
|
85
|
-
]
|
|
86
|
-
|
|
87
|
-
[[package]]
|
|
88
|
-
name = "lazy_static"
|
|
89
|
-
version = "1.5.0"
|
|
90
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
91
|
-
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|
92
|
-
|
|
93
|
-
[[package]]
|
|
94
|
-
name = "lazycell"
|
|
95
|
-
version = "1.3.0"
|
|
96
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
97
|
-
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
|
98
|
-
|
|
99
|
-
[[package]]
|
|
100
|
-
name = "libc"
|
|
101
|
-
version = "0.2.183"
|
|
102
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
103
|
-
checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
|
|
104
|
-
|
|
105
|
-
[[package]]
|
|
106
|
-
name = "libloading"
|
|
107
|
-
version = "0.8.9"
|
|
108
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
109
|
-
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
|
|
110
|
-
dependencies = [
|
|
111
|
-
"cfg-if",
|
|
112
|
-
"windows-link",
|
|
113
|
-
]
|
|
114
|
-
|
|
115
|
-
[[package]]
|
|
116
|
-
name = "lingua"
|
|
117
|
-
version = "0.1.0"
|
|
118
|
-
dependencies = [
|
|
119
|
-
"magnus",
|
|
120
|
-
]
|
|
121
|
-
|
|
122
|
-
[[package]]
|
|
123
|
-
name = "magnus"
|
|
124
|
-
version = "0.8.2"
|
|
125
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
126
|
-
checksum = "3b36a5b126bbe97eb0d02d07acfeb327036c6319fd816139a49824a83b7f9012"
|
|
127
|
-
dependencies = [
|
|
128
|
-
"magnus-macros",
|
|
129
|
-
"rb-sys",
|
|
130
|
-
"rb-sys-env",
|
|
131
|
-
"seq-macro",
|
|
132
|
-
]
|
|
133
|
-
|
|
134
|
-
[[package]]
|
|
135
|
-
name = "magnus-macros"
|
|
136
|
-
version = "0.8.0"
|
|
137
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
138
|
-
checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892"
|
|
139
|
-
dependencies = [
|
|
140
|
-
"proc-macro2",
|
|
141
|
-
"quote",
|
|
142
|
-
"syn",
|
|
143
|
-
]
|
|
144
|
-
|
|
145
|
-
[[package]]
|
|
146
|
-
name = "memchr"
|
|
147
|
-
version = "2.8.0"
|
|
148
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
149
|
-
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
|
150
|
-
|
|
151
|
-
[[package]]
|
|
152
|
-
name = "minimal-lexical"
|
|
153
|
-
version = "0.2.1"
|
|
154
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
155
|
-
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
|
156
|
-
|
|
157
|
-
[[package]]
|
|
158
|
-
name = "nom"
|
|
159
|
-
version = "7.1.3"
|
|
160
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
161
|
-
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
|
162
|
-
dependencies = [
|
|
163
|
-
"memchr",
|
|
164
|
-
"minimal-lexical",
|
|
165
|
-
]
|
|
166
|
-
|
|
167
|
-
[[package]]
|
|
168
|
-
name = "proc-macro2"
|
|
169
|
-
version = "1.0.106"
|
|
170
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
171
|
-
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
172
|
-
dependencies = [
|
|
173
|
-
"unicode-ident",
|
|
174
|
-
]
|
|
175
|
-
|
|
176
|
-
[[package]]
|
|
177
|
-
name = "quote"
|
|
178
|
-
version = "1.0.45"
|
|
179
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
180
|
-
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
|
181
|
-
dependencies = [
|
|
182
|
-
"proc-macro2",
|
|
183
|
-
]
|
|
184
|
-
|
|
185
|
-
[[package]]
|
|
186
|
-
name = "rb-sys"
|
|
187
|
-
version = "0.9.124"
|
|
188
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
189
|
-
checksum = "c85c4188462601e2aa1469def389c17228566f82ea72f137ed096f21591bc489"
|
|
190
|
-
dependencies = [
|
|
191
|
-
"rb-sys-build",
|
|
192
|
-
]
|
|
193
|
-
|
|
194
|
-
[[package]]
|
|
195
|
-
name = "rb-sys-build"
|
|
196
|
-
version = "0.9.124"
|
|
197
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
198
|
-
checksum = "568068db4102230882e6d4ae8de6632e224ca75fe5970f6e026a04e91ed635d3"
|
|
199
|
-
dependencies = [
|
|
200
|
-
"bindgen",
|
|
201
|
-
"lazy_static",
|
|
202
|
-
"proc-macro2",
|
|
203
|
-
"quote",
|
|
204
|
-
"regex",
|
|
205
|
-
"shell-words",
|
|
206
|
-
"syn",
|
|
207
|
-
]
|
|
208
|
-
|
|
209
|
-
[[package]]
|
|
210
|
-
name = "rb-sys-env"
|
|
211
|
-
version = "0.2.3"
|
|
212
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
213
|
-
checksum = "cca7ad6a7e21e72151d56fe2495a259b5670e204c3adac41ee7ef676ea08117a"
|
|
214
|
-
|
|
215
|
-
[[package]]
|
|
216
|
-
name = "regex"
|
|
217
|
-
version = "1.12.3"
|
|
218
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
219
|
-
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
|
220
|
-
dependencies = [
|
|
221
|
-
"aho-corasick",
|
|
222
|
-
"memchr",
|
|
223
|
-
"regex-automata",
|
|
224
|
-
"regex-syntax",
|
|
225
|
-
]
|
|
226
|
-
|
|
227
|
-
[[package]]
|
|
228
|
-
name = "regex-automata"
|
|
229
|
-
version = "0.4.14"
|
|
230
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
231
|
-
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
|
232
|
-
dependencies = [
|
|
233
|
-
"aho-corasick",
|
|
234
|
-
"memchr",
|
|
235
|
-
"regex-syntax",
|
|
236
|
-
]
|
|
237
|
-
|
|
238
|
-
[[package]]
|
|
239
|
-
name = "regex-syntax"
|
|
240
|
-
version = "0.8.10"
|
|
241
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
242
|
-
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
|
243
|
-
|
|
244
|
-
[[package]]
|
|
245
|
-
name = "rustc-hash"
|
|
246
|
-
version = "1.1.0"
|
|
247
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
248
|
-
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
|
249
|
-
|
|
250
|
-
[[package]]
|
|
251
|
-
name = "seq-macro"
|
|
252
|
-
version = "0.3.6"
|
|
253
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
254
|
-
checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
|
|
255
|
-
|
|
256
|
-
[[package]]
|
|
257
|
-
name = "shell-words"
|
|
258
|
-
version = "1.1.1"
|
|
259
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
260
|
-
checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77"
|
|
261
|
-
|
|
262
|
-
[[package]]
|
|
263
|
-
name = "shlex"
|
|
264
|
-
version = "1.3.0"
|
|
265
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
266
|
-
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
|
267
|
-
|
|
268
|
-
[[package]]
|
|
269
|
-
name = "syn"
|
|
270
|
-
version = "2.0.117"
|
|
271
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
272
|
-
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
|
273
|
-
dependencies = [
|
|
274
|
-
"proc-macro2",
|
|
275
|
-
"quote",
|
|
276
|
-
"unicode-ident",
|
|
277
|
-
]
|
|
278
|
-
|
|
279
|
-
[[package]]
|
|
280
|
-
name = "unicode-ident"
|
|
281
|
-
version = "1.0.24"
|
|
282
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
283
|
-
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
284
|
-
|
|
285
|
-
[[package]]
|
|
286
|
-
name = "windows-link"
|
|
287
|
-
version = "0.2.1"
|
|
288
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
289
|
-
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|