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.
Files changed (44) hide show
  1. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/Cargo.lock +2 -2
  2. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/PKG-INFO +2 -3
  3. {unicode_intervals-0.3.0/crates/unicode-intervals-py → unicode_intervals-0.3.1}/README.md +1 -2
  4. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/Cargo.toml +1 -1
  5. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/benches/bench.rs +74 -25
  6. unicode_intervals-0.3.1/crates/unicode-intervals/src/query.rs +641 -0
  7. unicode_intervals-0.3.1/crates/unicode-intervals-py/CHANGELOG.md +15 -0
  8. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/Cargo.toml +1 -1
  9. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1/crates/unicode-intervals-py}/README.md +1 -2
  10. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/src/lib.rs +16 -6
  11. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_api.py +8 -0
  12. unicode_intervals-0.3.0/crates/unicode-intervals/src/query.rs +0 -280
  13. unicode_intervals-0.3.0/crates/unicode-intervals-py/CHANGELOG.md +0 -5
  14. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/Cargo.toml +0 -0
  15. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/README.md +0 -0
  16. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/categories.rs +0 -0
  17. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/constants.rs +0 -0
  18. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/error.rs +0 -0
  19. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/intervals.rs +0 -0
  20. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/intervalset.rs +0 -0
  21. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/lib.rs +0 -0
  22. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/mod.rs +0 -0
  23. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v10_0_0.rs +0 -0
  24. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v11_0_0.rs +0 -0
  25. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v12_0_0.rs +0 -0
  26. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v12_1_0.rs +0 -0
  27. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v13_0_0.rs +0 -0
  28. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v14_0_0.rs +0 -0
  29. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v15_0_0.rs +0 -0
  30. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v15_1_0.rs +0 -0
  31. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v16_0_0.rs +0 -0
  32. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v17_0_0.rs +0 -0
  33. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals/src/tables/v9_0_0.rs +0 -0
  34. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/.gitignore +0 -0
  35. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/benches-py/test_vs_hypothesis.py +0 -0
  36. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/build.rs +0 -0
  37. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/rust-toolchain.toml +0 -0
  38. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_charmap_compat.py +0 -0
  39. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_docstrings.py +0 -0
  40. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/crates/unicode-intervals-py/tests-py/test_readme.py +0 -0
  41. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/pyproject.toml +0 -0
  42. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/python/unicode_intervals/__init__.py +0 -0
  43. {unicode_intervals-0.3.0 → unicode_intervals-0.3.1}/python/unicode_intervals/__init__.pyi +0 -0
  44. {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.0"
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.0"
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.0
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 (an extra over charmap): drop digits from U+0030..U+003A
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 (an extra over charmap): drop digits from U+0030..U+003A
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),)
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "unicode-intervals"
3
- version = "0.3.0"
3
+ version = "0.3.1"
4
4
  authors = ["Dmitry Dygalo <dmitry@dygalo.dev>"]
5
5
  edition = "2021"
6
6
  documentation = "https://github.com/Stranger6667/unicode-intervals"
@@ -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
- let _ = internals::categories::merge(
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
- let _ = version
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
- let _ = version
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
- let _ = version
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
- let _ = version
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
- let _ = version
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