icu4x 0.7.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a6127d334332b2d38a6ef3518d9e7c076158d4eb21a282a982709dde0e8a9e70
4
- data.tar.gz: 189fb0957980330e56c643bed174289039aa7f73f3d03d3ff91e8aab0211b6e4
3
+ metadata.gz: 7871f9d79af05cf7edf90ca57fc7351b6cf8d027b5017606369748825265d359
4
+ data.tar.gz: e47cf84063cf0d7b8841d22c8776937cabb2fab7324a0dcb3e9129e5cec2df61
5
5
  SHA512:
6
- metadata.gz: 660d2834ff4811ff545c95c44e0e1ddecdfeda53b48e1cfdafd6c7ca12387a00c48c2836ae2eab58ebaf9f654386231eac0c0c2674633b2ab702a1b3ef3cd1f3
7
- data.tar.gz: 87014b1b98c519d06f97b43a6697d344f94cc1ed4b055f4d4de13b269efefdb55d0d83628be2828adcbadbaebb419d4446e852dfa30c597d0c3478edab2b6560
6
+ metadata.gz: 9b7d7683237505c31d148451262825f40458ab916717949f7a6e1c6f76397eb94f898eda81a00d5131efee1ef904623d2b128b38a366ef39f8804c90fda48daa
7
+ data.tar.gz: 1ec09d4d5f4a4529aa4ac6a2747d1c16f3c5b66fbc60e3b28fcb8bafd5e0c4ba43b41a4fde5cdc5cd5e14f7bc2edb8cd0793ca86fe2b4052787929baa5e469be
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.8.0] - 2026-01-10
4
+
5
+ ### Added
6
+
7
+ - `ICU4X::Locale#maximize!` and `#maximize` methods to expand locale using Likely Subtags algorithm (UTS #35)
8
+ - `ICU4X::Locale#minimize!` and `#minimize` methods to remove redundant subtags
9
+
3
10
  ## [0.7.0] - 2026-01-09
4
11
 
5
12
  ### Added
@@ -1,6 +1,6 @@
1
1
  use crate::helpers;
2
- use icu_locale::Locale as IcuLocale;
3
- use magnus::{Error, RHash, RModule, Ruby, function, method, prelude::*};
2
+ use icu_locale::{Locale as IcuLocale, LocaleExpander, TransformResult};
3
+ use magnus::{Error, RHash, RModule, Ruby, function, method, prelude::*, typed_data::Obj};
4
4
  use std::cell::RefCell;
5
5
 
6
6
  /// Ruby wrapper for ICU4X Locale
@@ -162,6 +162,48 @@ impl Locale {
162
162
  fn eq(&self, other: &Locale) -> bool {
163
163
  *self.inner.borrow() == *other.inner.borrow()
164
164
  }
165
+
166
+ /// Maximize the locale in place (Add Likely Subtags algorithm, UTS #35)
167
+ /// Returns self if modified, nil if unchanged
168
+ fn maximize_bang(rb_self: Obj<Self>) -> Option<Obj<Self>> {
169
+ let expander = LocaleExpander::new_common();
170
+ let mut locale = rb_self.inner.borrow_mut();
171
+ match expander.maximize(&mut locale.id) {
172
+ TransformResult::Modified => Some(rb_self),
173
+ TransformResult::Unmodified => None,
174
+ }
175
+ }
176
+
177
+ /// Maximize the locale, returning a new Locale object
178
+ fn maximize(&self) -> Self {
179
+ let expander = LocaleExpander::new_common();
180
+ let mut new_id = self.inner.borrow().id.clone();
181
+ expander.maximize(&mut new_id);
182
+ Self {
183
+ inner: RefCell::new(IcuLocale::from(new_id)),
184
+ }
185
+ }
186
+
187
+ /// Minimize the locale in place (Remove Likely Subtags algorithm, UTS #35)
188
+ /// Returns self if modified, nil if unchanged
189
+ fn minimize_bang(rb_self: Obj<Self>) -> Option<Obj<Self>> {
190
+ let expander = LocaleExpander::new_common();
191
+ let mut locale = rb_self.inner.borrow_mut();
192
+ match expander.minimize(&mut locale.id) {
193
+ TransformResult::Modified => Some(rb_self),
194
+ TransformResult::Unmodified => None,
195
+ }
196
+ }
197
+
198
+ /// Minimize the locale, returning a new Locale object
199
+ fn minimize(&self) -> Self {
200
+ let expander = LocaleExpander::new_common();
201
+ let mut new_id = self.inner.borrow().id.clone();
202
+ expander.minimize(&mut new_id);
203
+ Self {
204
+ inner: RefCell::new(IcuLocale::from(new_id)),
205
+ }
206
+ }
165
207
  }
166
208
 
167
209
  pub fn init(ruby: &Ruby, module: &RModule) -> Result<(), Error> {
@@ -174,5 +216,9 @@ pub fn init(ruby: &Ruby, module: &RModule) -> Result<(), Error> {
174
216
  class.define_method("extensions", method!(Locale::extensions, 0))?;
175
217
  class.define_method("to_s", method!(Locale::to_s, 0))?;
176
218
  class.define_method("==", method!(Locale::eq, 1))?;
219
+ class.define_method("maximize!", method!(Locale::maximize_bang, 0))?;
220
+ class.define_method("maximize", method!(Locale::maximize, 0))?;
221
+ class.define_method("minimize!", method!(Locale::minimize_bang, 0))?;
222
+ class.define_method("minimize", method!(Locale::minimize, 0))?;
177
223
  Ok(())
178
224
  }
data/lib/icu4x/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ICU4X
4
- VERSION = "0.7.0"
4
+ VERSION = "0.8.0"
5
5
  public_constant :VERSION
6
6
  end
@@ -274,6 +274,74 @@
274
274
  # # @return [Integer] hash code
275
275
  # #
276
276
  # def hash; end
277
+ #
278
+ # # Maximizes the locale in place using the Add Likely Subtags algorithm (UTS #35).
279
+ # #
280
+ # # Adds likely script and region subtags based on the language.
281
+ # # This is useful for language negotiation.
282
+ # #
283
+ # # @return [self, nil] self if the locale was modified, nil if already maximized
284
+ # #
285
+ # # @example
286
+ # # locale = ICU4X::Locale.parse("en")
287
+ # # locale.maximize! #=> locale
288
+ # # locale.to_s #=> "en-Latn-US"
289
+ # #
290
+ # # @example Already maximized
291
+ # # locale = ICU4X::Locale.parse("en-Latn-US")
292
+ # # locale.maximize! #=> nil
293
+ # #
294
+ # # @see https://unicode.org/reports/tr35/#Likely_Subtags
295
+ # #
296
+ # def maximize!; end
297
+ #
298
+ # # Returns a new locale with likely subtags added.
299
+ # #
300
+ # # Non-destructive version of {#maximize!}. The original locale is unchanged.
301
+ # #
302
+ # # @return [Locale] a new locale with likely subtags added
303
+ # #
304
+ # # @example
305
+ # # locale = ICU4X::Locale.parse("zh")
306
+ # # expanded = locale.maximize
307
+ # # locale.to_s #=> "zh" (unchanged)
308
+ # # expanded.to_s #=> "zh-Hans-CN"
309
+ # #
310
+ # def maximize; end
311
+ #
312
+ # # Minimizes the locale in place using the Remove Likely Subtags algorithm (UTS #35).
313
+ # #
314
+ # # Removes redundant script and region subtags that can be inferred.
315
+ # # This is useful for language negotiation.
316
+ # #
317
+ # # @return [self, nil] self if the locale was modified, nil if already minimal
318
+ # #
319
+ # # @example
320
+ # # locale = ICU4X::Locale.parse("ja-Jpan-JP")
321
+ # # locale.minimize! #=> locale
322
+ # # locale.to_s #=> "ja"
323
+ # #
324
+ # # @example Already minimal
325
+ # # locale = ICU4X::Locale.parse("en")
326
+ # # locale.minimize! #=> nil
327
+ # #
328
+ # # @see https://unicode.org/reports/tr35/#Likely_Subtags
329
+ # #
330
+ # def minimize!; end
331
+ #
332
+ # # Returns a new locale with redundant subtags removed.
333
+ # #
334
+ # # Non-destructive version of {#minimize!}. The original locale is unchanged.
335
+ # #
336
+ # # @return [Locale] a new locale with redundant subtags removed
337
+ # #
338
+ # # @example
339
+ # # locale = ICU4X::Locale.parse("zh-Hans-CN")
340
+ # # minimal = locale.minimize
341
+ # # locale.to_s #=> "zh-Hans-CN" (unchanged)
342
+ # # minimal.to_s #=> "zh"
343
+ # #
344
+ # def minimize; end
277
345
  # end
278
346
  #
279
347
  # # Provides locale-aware plural rules for cardinal and ordinal numbers.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icu4x
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OZAWA Sakuro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-09 00:00:00.000000000 Z
11
+ date: 2026-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable