unicode-intervals 0.3.0__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/Cargo.lock +2 -2
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/PKG-INFO +2 -3
- {unicode_intervals-0.3.0/crates/unicode-intervals-py → unicode_intervals-0.3.1}/README.md +1 -2
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/Cargo.toml +1 -1
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/benches/bench.rs +74 -25
- unicode_intervals-0.3.1/crates/unicode-intervals/src/query.rs +641 -0
- unicode_intervals-0.3.1/crates/unicode-intervals-py/CHANGELOG.md +15 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/Cargo.toml +1 -1
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1/crates/unicode-intervals-py}/README.md +1 -2
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/src/lib.rs +16 -6
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_api.py +8 -0
- unicode_intervals-0.3.0/crates/unicode-intervals/src/query.rs +0 -280
- unicode_intervals-0.3.0/crates/unicode-intervals-py/CHANGELOG.md +0 -5
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/Cargo.toml +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/README.md +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/categories.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/constants.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/error.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/intervals.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/intervalset.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/lib.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/mod.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v10_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v11_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v12_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v12_1_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v13_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v14_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v15_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v15_1_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v16_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v17_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v9_0_0.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/.gitignore +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/benches-py/test_vs_hypothesis.py +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/build.rs +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/rust-toolchain.toml +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_charmap_compat.py +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_docstrings.py +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_readme.py +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/pyproject.toml +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/python/unicode_intervals/__init__.py +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/python/unicode_intervals/__init__.pyi +0 -0
- {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/python/unicode_intervals/py.typed +0 -0
|
@@ -991,7 +991,7 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
|
991
991
|
|
|
992
992
|
[[package]]
|
|
993
993
|
name = "unicode-intervals"
|
|
994
|
-
version = "0.3.
|
|
994
|
+
version = "0.3.1"
|
|
995
995
|
dependencies = [
|
|
996
996
|
"codspeed-criterion-compat",
|
|
997
997
|
"test-case",
|
|
@@ -999,7 +999,7 @@ dependencies = [
|
|
|
999
999
|
|
|
1000
1000
|
[[package]]
|
|
1001
1001
|
name = "unicode-intervals-py"
|
|
1002
|
-
version = "0.3.
|
|
1002
|
+
version = "0.3.1"
|
|
1003
1003
|
dependencies = [
|
|
1004
1004
|
"built",
|
|
1005
1005
|
"pyo3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: unicode_intervals
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Classifier: Programming Language :: Python :: 3
|
|
5
5
|
Classifier: Programming Language :: Python :: 3.10
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -26,7 +26,6 @@ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
|
26
26
|
# unicode-intervals
|
|
27
27
|
|
|
28
28
|
Search Unicode code point intervals by category, codepoint range, and characters.
|
|
29
|
-
Fast Rust core (via PyO3), output-compatible with Hypothesis's `charmap`.
|
|
30
29
|
|
|
31
30
|
## Installation
|
|
32
31
|
|
|
@@ -60,7 +59,7 @@ assert unicode_intervals.query(
|
|
|
60
59
|
categories=["Lu"], min_codepoint=65, max_codepoint=90, exclude_characters="AEIOU"
|
|
61
60
|
) == ((66, 68), (70, 72), (74, 78), (80, 84), (86, 90))
|
|
62
61
|
|
|
63
|
-
# Exclude whole categories
|
|
62
|
+
# Exclude whole categories: drop digits from U+0030..U+003A
|
|
64
63
|
assert unicode_intervals.query(
|
|
65
64
|
exclude_categories=["Nd"], min_codepoint=48, max_codepoint=58
|
|
66
65
|
) == ((58, 58),)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# unicode-intervals
|
|
2
2
|
|
|
3
3
|
Search Unicode code point intervals by category, codepoint range, and characters.
|
|
4
|
-
Fast Rust core (via PyO3), output-compatible with Hypothesis's `charmap`.
|
|
5
4
|
|
|
6
5
|
## Installation
|
|
7
6
|
|
|
@@ -35,7 +34,7 @@ assert unicode_intervals.query(
|
|
|
35
34
|
categories=["Lu"], min_codepoint=65, max_codepoint=90, exclude_characters="AEIOU"
|
|
36
35
|
) == ((66, 68), (70, 72), (74, 78), (80, 84), (86, 90))
|
|
37
36
|
|
|
38
|
-
# Exclude whole categories
|
|
37
|
+
# Exclude whole categories: drop digits from U+0030..U+003A
|
|
39
38
|
assert unicode_intervals.query(
|
|
40
39
|
exclude_categories=["Nd"], min_codepoint=48, max_codepoint=58
|
|
41
40
|
) == ((58, 58),)
|
{unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/benches/bench.rs
RENAMED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
|
1
|
+
use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion};
|
|
2
2
|
use unicode_intervals::{internals, UnicodeCategory, UnicodeCategorySet, UnicodeVersion};
|
|
3
3
|
|
|
4
4
|
fn version(c: &mut Criterion) {
|
|
5
5
|
let version = black_box(UnicodeVersion::V15_0_0);
|
|
6
6
|
c.bench_function("version - normalized_categories", |b| {
|
|
7
|
-
b.iter(||
|
|
8
|
-
let _ = version.normalized_categories();
|
|
9
|
-
})
|
|
7
|
+
b.iter(|| version.normalized_categories())
|
|
10
8
|
});
|
|
11
9
|
}
|
|
12
10
|
|
|
@@ -32,27 +30,42 @@ fn intervals(c: &mut Criterion) {
|
|
|
32
30
|
c.bench_function("intervals - subtract sparse", |b| {
|
|
33
31
|
b.iter(|| internals::intervals::subtract(large.to_vec(), &few))
|
|
34
32
|
});
|
|
33
|
+
// Concatenated, sorted-per-category slices that interleave across the codepoint space:
|
|
34
|
+
// the input shape `query` feeds to `merge` for a multi-category set.
|
|
35
|
+
let multi = internals::query::intervals_for_set(
|
|
36
|
+
UnicodeVersion::V15_0_0,
|
|
37
|
+
UnicodeCategory::Lu
|
|
38
|
+
| UnicodeCategory::Ll
|
|
39
|
+
| UnicodeCategory::Lo
|
|
40
|
+
| UnicodeCategory::Nd
|
|
41
|
+
| UnicodeCategory::Po
|
|
42
|
+
| UnicodeCategory::Sm,
|
|
43
|
+
)
|
|
44
|
+
.into_owned();
|
|
45
|
+
c.bench_function("intervals - merge multi-category", |b| {
|
|
46
|
+
b.iter_batched(
|
|
47
|
+
|| multi.clone(),
|
|
48
|
+
|mut intervals| internals::intervals::merge(&mut intervals),
|
|
49
|
+
BatchSize::SmallInput,
|
|
50
|
+
)
|
|
51
|
+
});
|
|
35
52
|
}
|
|
36
53
|
|
|
37
54
|
fn categories(c: &mut Criterion) {
|
|
38
55
|
let all_categories = black_box(UnicodeCategorySet::all());
|
|
39
56
|
c.bench_function("categories - set - display - all", |b| {
|
|
40
|
-
b.iter(||
|
|
41
|
-
let _ = all_categories.to_string();
|
|
42
|
-
})
|
|
57
|
+
b.iter(|| all_categories.to_string())
|
|
43
58
|
});
|
|
44
59
|
let few_categories = UnicodeCategory::Lm | UnicodeCategory::Sk | UnicodeCategory::Zl;
|
|
45
60
|
c.bench_function("categories - set - display - few", |b| {
|
|
46
|
-
b.iter(||
|
|
47
|
-
let _ = few_categories.to_string();
|
|
48
|
-
})
|
|
61
|
+
b.iter(|| few_categories.to_string())
|
|
49
62
|
});
|
|
50
63
|
c.bench_function("categories - merge", |b| {
|
|
51
64
|
b.iter(|| {
|
|
52
|
-
|
|
65
|
+
internals::categories::merge(
|
|
53
66
|
Some(all_categories),
|
|
54
67
|
black_box(UnicodeCategory::Lu.into()),
|
|
55
|
-
)
|
|
68
|
+
)
|
|
56
69
|
})
|
|
57
70
|
});
|
|
58
71
|
}
|
|
@@ -82,60 +95,98 @@ fn query(c: &mut Criterion) {
|
|
|
82
95
|
)
|
|
83
96
|
})
|
|
84
97
|
});
|
|
98
|
+
// Full range + multiple categories: hits the concat + sort/merge path over the whole set.
|
|
99
|
+
c.bench_function("query - multiple categories - full range", |b| {
|
|
100
|
+
b.iter(|| {
|
|
101
|
+
version
|
|
102
|
+
.query()
|
|
103
|
+
.include_categories(black_box(
|
|
104
|
+
UnicodeCategory::Lu
|
|
105
|
+
| UnicodeCategory::Ll
|
|
106
|
+
| UnicodeCategory::Lo
|
|
107
|
+
| UnicodeCategory::Nd
|
|
108
|
+
| UnicodeCategory::Po
|
|
109
|
+
| UnicodeCategory::Sm,
|
|
110
|
+
))
|
|
111
|
+
.intervals()
|
|
112
|
+
})
|
|
113
|
+
});
|
|
85
114
|
let exclude_categories = black_box(UnicodeCategory::Lu);
|
|
86
115
|
let min_codepoint = black_box(0);
|
|
87
116
|
let max_codepoint = black_box(128);
|
|
88
117
|
c.bench_function("query - top level - only codepoints", |b| {
|
|
89
118
|
b.iter(|| {
|
|
90
|
-
|
|
119
|
+
version
|
|
91
120
|
.query()
|
|
92
121
|
.exclude_categories(exclude_categories)
|
|
93
122
|
.min_codepoint(min_codepoint)
|
|
94
123
|
.max_codepoint(max_codepoint)
|
|
95
|
-
.intervals()
|
|
124
|
+
.intervals()
|
|
96
125
|
})
|
|
97
126
|
});
|
|
98
127
|
c.bench_function("query - top level - exclude chars", |b| {
|
|
99
128
|
b.iter(|| {
|
|
100
|
-
|
|
129
|
+
version
|
|
101
130
|
.query()
|
|
102
131
|
.exclude_categories(exclude_categories)
|
|
103
132
|
.exclude_characters(black_box("A@т"))
|
|
104
133
|
.min_codepoint(min_codepoint)
|
|
105
134
|
.max_codepoint(max_codepoint)
|
|
106
|
-
.intervals()
|
|
135
|
+
.intervals()
|
|
107
136
|
})
|
|
108
137
|
});
|
|
109
138
|
c.bench_function("query - top level - include and exclude chars", |b| {
|
|
110
139
|
b.iter(|| {
|
|
111
|
-
|
|
140
|
+
version
|
|
112
141
|
.query()
|
|
113
142
|
.exclude_categories(exclude_categories)
|
|
114
143
|
.include_characters(black_box("0123456789"))
|
|
115
144
|
.exclude_characters(black_box("QWERTYUIOP"))
|
|
116
145
|
.min_codepoint(min_codepoint)
|
|
117
146
|
.max_codepoint(max_codepoint)
|
|
118
|
-
.intervals()
|
|
147
|
+
.intervals()
|
|
119
148
|
})
|
|
120
149
|
});
|
|
121
150
|
c.bench_function("query - top level - include only", |b| {
|
|
122
151
|
b.iter(|| {
|
|
123
|
-
|
|
152
|
+
version
|
|
124
153
|
.query()
|
|
125
154
|
.include_categories(UnicodeCategory::Ll)
|
|
126
155
|
.include_characters("ABC")
|
|
127
156
|
.min_codepoint(0)
|
|
128
157
|
.max_codepoint(50)
|
|
129
|
-
.intervals()
|
|
158
|
+
.intervals()
|
|
130
159
|
})
|
|
131
160
|
});
|
|
132
161
|
c.bench_function("query - single category - codepoint range", |b| {
|
|
133
162
|
b.iter(|| {
|
|
134
|
-
|
|
163
|
+
version
|
|
135
164
|
.query()
|
|
136
165
|
.include_categories(black_box(UnicodeCategory::Lo))
|
|
137
166
|
.max_codepoint(black_box(0x1_0000))
|
|
138
|
-
.intervals()
|
|
167
|
+
.intervals()
|
|
168
|
+
})
|
|
169
|
+
});
|
|
170
|
+
// High `min_codepoint`: most of the category's intervals sit below the range and are
|
|
171
|
+
// skipped by the binary search in `extend_clamped`.
|
|
172
|
+
c.bench_function("query - single category - high range", |b| {
|
|
173
|
+
b.iter(|| {
|
|
174
|
+
version
|
|
175
|
+
.query()
|
|
176
|
+
.include_categories(black_box(UnicodeCategory::Lo))
|
|
177
|
+
.min_codepoint(black_box(0x2_0000))
|
|
178
|
+
.max_codepoint(black_box(0x2_4000))
|
|
179
|
+
.intervals()
|
|
180
|
+
})
|
|
181
|
+
});
|
|
182
|
+
c.bench_function("query - multiple categories - high range", |b| {
|
|
183
|
+
b.iter(|| {
|
|
184
|
+
version
|
|
185
|
+
.query()
|
|
186
|
+
.include_categories(black_box(UnicodeCategory::Lu | UnicodeCategory::Ll))
|
|
187
|
+
.min_codepoint(black_box(0x1_0000))
|
|
188
|
+
.max_codepoint(black_box(0x1_0500))
|
|
189
|
+
.intervals()
|
|
139
190
|
})
|
|
140
191
|
});
|
|
141
192
|
let interval_set = UnicodeVersion::V15_0_0
|
|
@@ -144,9 +195,7 @@ fn query(c: &mut Criterion) {
|
|
|
144
195
|
.interval_set()
|
|
145
196
|
.expect("Invalid query input");
|
|
146
197
|
c.bench_function("query - interval set - codepoint_at", |b| {
|
|
147
|
-
b.iter(||
|
|
148
|
-
let _ = interval_set.codepoint_at(27);
|
|
149
|
-
})
|
|
198
|
+
b.iter(|| interval_set.codepoint_at(27))
|
|
150
199
|
});
|
|
151
200
|
}
|
|
152
201
|
|