unicode-scripts 1.10.0 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 619c8f5ddc697b93bff330edd8dae275a9684f0410272237284de4f829779803
4
- data.tar.gz: d0468aeae3dac7525f1f8a79816fde9eb450dccf8b984e685d0a8b8409acb81f
3
+ metadata.gz: feaabd20c3a3869a96e62e34d7c39b83739365549904ecdb129e83d9f73540d4
4
+ data.tar.gz: 40af16102c2aa63b35051f09b65cd8e2d14c32fbce21a7c802ea260121ade5b5
5
5
  SHA512:
6
- metadata.gz: 98f89704fd77edeea1079eb26011c23c29c8fb36eb0b078848d097069a935771adbbd8946a4289031d5575056065cf1c641a0e6a3248fdf017ed72de0efbfff4
7
- data.tar.gz: d374cba93bd2e84ac064f4583bca2df4e66029cb5dd3d21fee4d52689f6c4de738c926eb93b1c67e4f8ae149b6a58ffb8cb67e5ee8f66ba9cea2227553e59fc5
6
+ metadata.gz: 8d5f215ed6b03d5192eef673d22f0705cac149e3701427570ab52b4e3c538ac1537b7ca5a0768a66e6d5ffdd4d66b9363b4fdafbdf74112df1e7e59ab639cf2c
7
+ data.tar.gz: 735b9611f0bfee72dd074a8873c3c269d23a150b6d7a9da64ca33b7d02c5a65316a45eaa47bb60fc44a554b70d3efbd3bcd8cf0c94185e01d7fdd5f767766839
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## CHANGELOG
2
2
 
3
+ ### 1.11.0
4
+
5
+ - Add augmented scripts and mixed-script detection (as described in UTS39)
6
+
3
7
  ### 1.10.0
4
8
 
5
9
  - Unicode 16.0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unicode-scripts (1.10.0)
4
+ unicode-scripts (1.11.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # Unicode::Scripts [![[version]](https://badge.fury.io/rb/unicode-scripts.svg)](https://badge.fury.io/rb/unicode-scripts) [![[ci]](https://github.com/janlelis/unicode-scripts/workflows/Test/badge.svg)](https://github.com/janlelis/unicode-scripts/actions?query=workflow%3ATest)
2
2
 
3
- Retrieve the [Unicode script(s)](https://en.wikipedia.org/wiki/Script_%28Unicode%29) a string belongs to. Can also return the *Script_Extension* property which is defined as characters which are "commonly used with more than one script, but with a limited number of scripts".
3
+ Retrieve all [Unicode script(s)](https://en.wikipedia.org/wiki/Script_%28Unicode%29) a string belongs to. Can also return the *Script_Extension* property (scx) which is defined as characters which are "commonly used with more than one script, but with a limited number of scripts".
4
4
 
5
- Unicode version: **16.0.0** (September 2024)
5
+ Based on the *Script_Extension*, this library can also return the [augmented script set](https://www.unicode.org/reports/tr39/#def-augmented-script-set) to figure out if a string is **mixed-script** or **single-script**. Mixed scripts can be an indicator of suspicious user inputs.
6
6
 
7
- Supported Rubies: **3.3**, **3.2**, **3.1**, **3.0**
7
+ Unicode version: **16.0.0** (September 2024)
8
8
 
9
- Old Rubies that might still work: **2.7**, **2.6**, **2.5**, **2.4**, **2.3**, **2.X**
9
+ Supported Rubies: **3.x** (might work: **2.x**)
10
10
 
11
11
  ## Gemfile
12
12
 
@@ -14,7 +14,7 @@ Old Rubies that might still work: **2.7**, **2.6**, **2.5**, **2.4**, **2.3**, *
14
14
  gem "unicode-scripts"
15
15
  ```
16
16
 
17
- ## Usage
17
+ ## Usage - Scripts and Script Extensions
18
18
 
19
19
  ```ruby
20
20
  require "unicode/scripts"
@@ -34,387 +34,97 @@ Unicode::Scripts.script_extensions("॥")
34
34
  "Oriya", "Sinhala", "Syloti_Nagri", "Takri", "Tamil", "Telugu", "Tirhuta"]
35
35
  ```
36
36
 
37
- ## Hints
38
- ### Regex Matching
37
+ ## Usage - Augmented Scripts
39
38
 
40
- If you have a string and want to match a substring/character from a specific Unicode script, you actually won't need this gem. Instead, you can use the [Regexp Unicode Property Syntax `\p{}`](https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Character+Properties):
39
+ Like script extensions, but adds meta scripts for Asian languages and treats _Common_/_Inherited_ values as ALL scripts.
41
40
 
42
41
  ```ruby
43
- "Coptic letter: ⲁ".scan(/\p{Coptic}/) # => ["ⲁ"]
42
+ require "unicode/scripts"
43
+
44
+ Unicode::Scripts.augmented_scripts("ねガ") # => ['Hira', 'Kana', 'Jpan']
45
+ Unicode::Scripts.augmented_scripts("1") # => ["Adlm", "Aghb", "Ahom", … ]
44
46
  ```
45
47
 
46
- See [Idiosyncratic Ruby: Proper Unicoding](https://idiosyncratic-ruby.com/41-proper-unicoding.html) for more info.
48
+ ## Usage - Resolved Script
49
+
50
+ Intersection of all augmented scripts per character.
51
+
52
+ ```ruby
53
+ require "unicode/scripts"
54
+
55
+ Unicode::Scripts.resolved_scripts("СігсӀе") # => [ 'Cyrl' ]
56
+ Unicode::Scripts.resolved_scripts("Сirсlе") # => []
57
+ Unicode::Scripts.resolved_scripts("𝖢𝗂𝗋𝖼𝗅𝖾") # => ['Adlm', 'Aghb', 'Ahom', … ]
58
+ Unicode::Scripts.resolved_scripts("1") # => ['Adlm','Aghb', 'Ahom', … ]
59
+ Unicode::Scripts.resolved_scripts("ねガ") # => ['Hira', 'Kana', 'Jpan']
60
+ ```
61
+
62
+ Please note that the **resolved script** can contain multiple scripts, as per standard.
63
+
64
+ ## Usage - Mixed-Script Detection
65
+
66
+ Mixed-script if resolved script set is empty, single-script otherwise.
67
+
68
+ ```ruby
69
+ require "unicode/scripts"
47
70
 
48
- ### Script Names
71
+ Unicode::Scripts.mixed?("СігсӀе"); # => false
72
+ Unicode::Scripts.mixed?("Сirсlе"); # => true
73
+ Unicode::Scripts.mixed?("𝖢𝗂𝗋𝖼𝗅𝖾"); # => false
74
+ Unicode::Scripts.mixed?("1"); # => false
75
+ Unicode::Scripts.mixed?("ねガ"); # => false
76
+
77
+ Unicode::Scripts.single?("СігсӀе"); # => true
78
+ Unicode::Scripts.single?("Сirсlе"); # => false
79
+ Unicode::Scripts.single?("𝖢𝗂𝗋𝖼𝗅𝖾"); # => true
80
+ Unicode::Scripts.single?("1"); # => true
81
+ Unicode::Scripts.single?("ねガ"); # => true
82
+ ```
83
+
84
+ Please note that a **single-script** string might actually contain multiple scripts, as per standard (e.g. for Asian languages)
85
+
86
+ ### List of All Scripts
49
87
 
50
88
  You can extract all script names from the gem like this:
51
89
 
52
90
  ```ruby
53
91
  require "unicode/scripts"
54
- puts Unicode::Scripts.names
55
-
56
- # # # Output # # #
57
-
58
- Adlam
59
- Ahom
60
- Anatolian_Hieroglyphs
61
- Arabic
62
- Armenian
63
- Avestan
64
- Balinese
65
- Bamum
66
- Bassa_Vah
67
- Batak
68
- Bengali
69
- Bhaiksuki
70
- Bopomofo
71
- Brahmi
72
- Braille
73
- Buginese
74
- Buhid
75
- Canadian_Aboriginal
76
- Carian
77
- Caucasian_Albanian
78
- Chakma
79
- Cham
80
- Cherokee
81
- Chorasmian
82
- Common
83
- Coptic
84
- Cuneiform
85
- Cypriot
86
- Cypro_Minoan
87
- Cyrillic
88
- Deseret
89
- Devanagari
90
- Dives_Akuru
91
- Dogra
92
- Duployan
93
- Egyptian_Hieroglyphs
94
- Elbasan
95
- Elymaic
96
- Ethiopic
97
- Garay
98
- Georgian
99
- Glagolitic
100
- Gothic
101
- Grantha
102
- Greek
103
- Gujarati
104
- Gunjala_Gondi
105
- Gurmukhi
106
- Gurung_Khema
107
- Han
108
- Hangul
109
- Hanifi_Rohingya
110
- Hanunoo
111
- Hatran
112
- Hebrew
113
- Hiragana
114
- Imperial_Aramaic
115
- Inherited
116
- Inscriptional_Pahlavi
117
- Inscriptional_Parthian
118
- Javanese
119
- Kaithi
120
- Kannada
121
- Katakana
122
- Katakana_Or_Hiragana
123
- Kawi
124
- Kayah_Li
125
- Kharoshthi
126
- Khitan_Small_Script
127
- Khmer
128
- Khojki
129
- Khudawadi
130
- Kirat_Rai
131
- Lao
132
- Latin
133
- Lepcha
134
- Limbu
135
- Linear_A
136
- Linear_B
137
- Lisu
138
- Lycian
139
- Lydian
140
- Mahajani
141
- Makasar
142
- Malayalam
143
- Mandaic
144
- Manichaean
145
- Marchen
146
- Masaram_Gondi
147
- Medefaidrin
148
- Meetei_Mayek
149
- Mende_Kikakui
150
- Meroitic_Cursive
151
- Meroitic_Hieroglyphs
152
- Miao
153
- Modi
154
- Mongolian
155
- Mro
156
- Multani
157
- Myanmar
158
- Nabataean
159
- Nag_Mundari
160
- Nandinagari
161
- New_Tai_Lue
162
- Newa
163
- Nko
164
- Nushu
165
- Nyiakeng_Puachue_Hmong
166
- Ogham
167
- Ol_Chiki
168
- Ol_Onal
169
- Old_Hungarian
170
- Old_Italic
171
- Old_North_Arabian
172
- Old_Permic
173
- Old_Persian
174
- Old_Sogdian
175
- Old_South_Arabian
176
- Old_Turkic
177
- Old_Uyghur
178
- Oriya
179
- Osage
180
- Osmanya
181
- Pahawh_Hmong
182
- Palmyrene
183
- Pau_Cin_Hau
184
- Phags_Pa
185
- Phoenician
186
- Psalter_Pahlavi
187
- Rejang
188
- Runic
189
- Samaritan
190
- Saurashtra
191
- Sharada
192
- Shavian
193
- Siddham
194
- SignWriting
195
- Sinhala
196
- Sogdian
197
- Sora_Sompeng
198
- Soyombo
199
- Sundanese
200
- Sunuwar
201
- Syloti_Nagri
202
- Syriac
203
- Tagalog
204
- Tagbanwa
205
- Tai_Le
206
- Tai_Tham
207
- Tai_Viet
208
- Takri
209
- Tamil
210
- Tangsa
211
- Tangut
212
- Telugu
213
- Thaana
214
- Thai
215
- Tibetan
216
- Tifinagh
217
- Tirhuta
218
- Todhri
219
- Toto
220
- Tulu_Tigalari
221
- Ugaritic
222
- Unknown
223
- Vai
224
- Vithkuqi
225
- Wancho
226
- Warang_Citi
227
- Yezidi
228
- Yi
229
- Zanabazar_Square
92
+ puts Unicode::Scripts.names # list of scripts
230
93
  ```
231
94
 
232
- ### Short Script Names
233
- You can extract all 4 letter script names from the gem like this:
95
+ To get all 4 letter script codes (ISO 15924):
234
96
 
235
97
  ```ruby
236
98
  require "unicode/scripts"
237
- puts Unicode::Scripts.names(format: :short)
238
-
239
- # # # Output # # #
240
-
241
- Adlm
242
- Aghb
243
- Ahom
244
- Arab
245
- Armi
246
- Armn
247
- Avst
248
- Bali
249
- Bamu
250
- Bass
251
- Batk
252
- Beng
253
- Bhks
254
- Bopo
255
- Brah
256
- Brai
257
- Bugi
258
- Buhd
259
- Cakm
260
- Cans
261
- Cari
262
- Cham
263
- Cher
264
- Chrs
265
- Copt
266
- Cpmn
267
- Cprt
268
- Cyrl
269
- Deva
270
- Diak
271
- Dogr
272
- Dsrt
273
- Dupl
274
- Egyp
275
- Elba
276
- Elym
277
- Ethi
278
- Gara
279
- Geor
280
- Glag
281
- Gong
282
- Gonm
283
- Goth
284
- Gran
285
- Grek
286
- Gujr
287
- Gukh
288
- Guru
289
- Hang
290
- Hani
291
- Hano
292
- Hatr
293
- Hebr
294
- Hira
295
- Hluw
296
- Hmng
297
- Hmnp
298
- Hrkt
299
- Hung
300
- Ital
301
- Java
302
- Kali
303
- Kana
304
- Kawi
305
- Khar
306
- Khmr
307
- Khoj
308
- Kits
309
- Knda
310
- Krai
311
- Kthi
312
- Lana
313
- Laoo
314
- Latn
315
- Lepc
316
- Limb
317
- Lina
318
- Linb
319
- Lisu
320
- Lyci
321
- Lydi
322
- Mahj
323
- Maka
324
- Mand
325
- Mani
326
- Marc
327
- Medf
328
- Mend
329
- Merc
330
- Mero
331
- Mlym
332
- Modi
333
- Mong
334
- Mroo
335
- Mtei
336
- Mult
337
- Mymr
338
- Nagm
339
- Nand
340
- Narb
341
- Nbat
342
- Newa
343
- Nkoo
344
- Nshu
345
- Ogam
346
- Olck
347
- Onao
348
- Orkh
349
- Orya
350
- Osge
351
- Osma
352
- Ougr
353
- Palm
354
- Pauc
355
- Perm
356
- Phag
357
- Phli
358
- Phlp
359
- Phnx
360
- Plrd
361
- Prti
362
- Qaac
363
- Qaai
364
- Rjng
365
- Rohg
366
- Runr
367
- Samr
368
- Sarb
369
- Saur
370
- Sgnw
371
- Shaw
372
- Shrd
373
- Sidd
374
- Sind
375
- Sinh
376
- Sogd
377
- Sogo
378
- Sora
379
- Soyo
380
- Sund
381
- Sunu
382
- Sylo
383
- Syrc
384
- Tagb
385
- Takr
386
- Tale
387
- Talu
388
- Taml
389
- Tang
390
- Tavt
391
- Telu
392
- Tfng
393
- Tglg
394
- Thaa
395
- Thai
396
- Tibt
397
- Tirh
398
- Tnsa
399
- Todr
400
- Toto
401
- Tutg
402
- Ugar
403
- Vaii
404
- Vith
405
- Wara
406
- Wcho
407
- Xpeo
408
- Xsux
409
- Yezi
410
- Yiii
411
- Zanb
412
- Zinh
413
- Zyyy
414
- Zzzz
99
+ puts Unicode::Scripts.names(format: :short) # list of scripts
415
100
  ```
416
101
 
417
- See [unicode-x](https://github.com/janlelis/unicode-x) for more Unicode related micro libraries.
102
+ Augmented scripts:
103
+
104
+ ```ruby
105
+ require "unicode/scripts"
106
+ puts Unicode::Scripts.names(format: :short, augmented: :only)
107
+ ```
108
+
109
+ You can find a list of all scripts in Unicode, with links to Wikipedia on [character.construction/scripts](https://character.construction/scripts)
110
+
111
+ ## Hints
112
+ ### Regex Matching
113
+
114
+ If you have a string and want to match a substring/character from a specific Unicode script, you actually won't need this gem. Instead, you can use the [Regexp Unicode Property Syntax `\p{}`](https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Character+Properties):
115
+
116
+ ```ruby
117
+ "Coptic letter: ⲁ".scan(/\p{Coptic}/) # => ["ⲁ"]
118
+ ```
119
+
120
+ See [Idiosyncratic Ruby: Proper Unicoding](https://idiosyncratic-ruby.com/41-proper-unicoding.html) for more info.
121
+
122
+ ## Also See
123
+
124
+ - JavaScript implementation (same data & algorithms): [unicode-script.js](https://github.com/janlelis/unicode-script.js)
125
+ - Index created with: [unicoder](https://github.com/janlelis/unicoder)
126
+ - Get the Unicode blocks of a string: [unicode-blocks gem](https://github.com/janlelis/unicode-blocks)
127
+ - See [unicode-x](https://github.com/janlelis/unicode-x) for more Unicode related micro libraries for Ruby.
418
128
 
419
129
  ## MIT License
420
130
 
@@ -2,9 +2,11 @@
2
2
 
3
3
  module Unicode
4
4
  module Scripts
5
- VERSION = "1.10.0"
5
+ VERSION = "1.11.0"
6
6
  UNICODE_VERSION = "16.0.0"
7
7
  DATA_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/../../../data/").freeze
8
8
  INDEX_FILENAME = (DATA_DIRECTORY + "/scripts.marshal.gz").freeze
9
+
10
+ AUGMENTED_SCRIPT_CODES = ["Hanb", "Jpan", "Kore"]
9
11
  end
10
12
  end
@@ -46,11 +46,77 @@ module Unicode
46
46
  }.sort
47
47
  end
48
48
 
49
- def self.names(format: :long)
49
+ def self.augmented_scripts(string)
50
50
  require_relative 'scripts/index' unless defined? ::Unicode::Scripts::INDEX
51
- format == :long ?
52
- INDEX[:SCRIPT_NAMES].sort :
53
- INDEX[:SCRIPT_ALIASES].keys.sort
51
+
52
+ augmented = string.each_codepoint.inject([]){ |res, codepoint|
53
+ if new_scripts = INDEX[:SCRIPT_EXTENSIONS][codepoint]
54
+ script_extension_names = new_scripts.map{ |new_script|
55
+ INDEX[:SCRIPT_ALIASES].key(new_script)
56
+ }
57
+ else
58
+ script_extension_names = scripts([codepoint].pack("U"), format: :short)
59
+ end
60
+
61
+ res | script_extension_names
62
+ }
63
+
64
+ if augmented.include? "Hani"
65
+ augmented |= ["Hanb", "Jpan", "Kore"]
66
+ end
67
+ if augmented.include?("Hira") || augmented.include?("Kana")
68
+ augmented |= ["Jpan"]
69
+ end
70
+ if augmented.include? "Hang"
71
+ augmented |= ["Kore"]
72
+ end
73
+ if augmented.include? "Bopo"
74
+ augmented |= ["Hanb"]
75
+ end
76
+ if augmented.include?("Zyyy") || augmented.include?("Zinh")
77
+ augmented |= names(format: :short, augmented: :include )
78
+ end
79
+
80
+ augmented.sort
81
+ end
82
+
83
+ def self.resolved_scripts(string)
84
+ string.chars.reduce(
85
+ Unicode::Scripts.names(format: :short, augmented: :include)
86
+ ){ |acc, char|
87
+ acc & augmented_scripts(char)
88
+ }
89
+ end
90
+
91
+ def self.mixed?(string)
92
+ resolved_scripts(string).empty?
93
+ end
94
+
95
+ def self.single?(string)
96
+ !resolved_scripts(string).empty?
97
+ end
98
+
99
+ # Lists scripts. Options:
100
+ # - format - :long, :short
101
+ # - augmented - :include, :exclude, :only
102
+ def self.names(format: :long, augmented: :exclude)
103
+ if format == :long && augmented != :exclude
104
+ raise ArgumentError, "only short four-letter script codes (ISO 15924) supported when listing augmented scripts"
105
+ end
106
+
107
+ if augmented == :only
108
+ return AUGMENTED_SCRIPT_CODES
109
+ end
110
+
111
+ require_relative 'scripts/index' unless defined? ::Unicode::Scripts::INDEX
112
+
113
+ if format == :long
114
+ INDEX[:SCRIPT_NAMES].sort
115
+ elsif augmented == :exclude
116
+ INDEX[:SCRIPT_ALIASES].keys.sort
117
+ else
118
+ (INDEX[:SCRIPT_ALIASES].keys + AUGMENTED_SCRIPT_CODES).sort
119
+ end
54
120
  end
55
121
  end
56
122
  end
@@ -130,11 +130,61 @@ describe Unicode::Scripts do
130
130
  end
131
131
  end
132
132
 
133
+ describe ".augmented_scripts" do
134
+ it "will always return an Array" do
135
+ assert_equal [], Unicode::Scripts.augmented_scripts("")
136
+ end
137
+
138
+ it "will return all extended scripts that characters in the string belong to + augmented" do
139
+ assert_equal ["Hira", "Jpan", "Kana"], Unicode::Scripts.augmented_scripts("ねガ")
140
+ end
141
+
142
+ it "will replace Common with all scripts" do
143
+ assert_equal \
144
+ Unicode::Scripts.names(format: :short, augmented: :include),
145
+ Unicode::Scripts.augmented_scripts("1")
146
+ end
147
+ end
148
+
149
+ describe ".resolved_scripts" do
150
+ it "return intersection of augmented scripts per character" do
151
+ assert_equal ["Cyrl"], Unicode::Scripts.resolved_scripts("СігсӀе")
152
+ assert_equal [], Unicode::Scripts.resolved_scripts("Сirсlе")
153
+ assert_equal \
154
+ Unicode::Scripts.names(format: :short, augmented: :include),
155
+ Unicode::Scripts.resolved_scripts("𝖢𝗂𝗋𝖼𝗅𝖾")
156
+ end
157
+ end
158
+
159
+ describe "mixed?" do
160
+ it "will return true if .resolved_scripts(string) is empty" do
161
+ assert_equal false, Unicode::Scripts.mixed?("СігсӀе")
162
+ assert Unicode::Scripts.mixed?("Сirсlе")
163
+ assert_equal false, Unicode::Scripts.mixed?("𝖢𝗂𝗋𝖼𝗅𝖾")
164
+ assert_equal false, Unicode::Scripts.mixed?("1")
165
+ assert_equal false, Unicode::Scripts.mixed?("ねガ")
166
+ end
167
+ end
168
+
169
+ describe "single?" do
170
+ it "will return true if .resolved_scripts(string) is not empty" do
171
+ assert Unicode::Scripts.single?("СігсӀе")
172
+ assert_equal false, Unicode::Scripts.single?("Сirсlе")
173
+ assert Unicode::Scripts.single?("𝖢𝗂𝗋𝖼𝗅𝖾")
174
+ assert Unicode::Scripts.single?("1")
175
+ assert Unicode::Scripts.single?("ねガ")
176
+ end
177
+ end
178
+
133
179
  describe ".names" do
134
180
  it "will return a list of all script names" do
135
181
  assert_kind_of Array, Unicode::Scripts.names
136
182
  assert_includes Unicode::Scripts.names, "Inscriptional_Parthian"
137
183
  end
184
+
185
+ it "will return a list of all augmented script codes" do
186
+ assert_equal Unicode::Scripts.names(format: :short, augmented: :only), ["Hanb", "Jpan", "Kore"]
187
+ end
138
188
  end
139
189
  end
140
190
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicode-scripts
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Lelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-12 00:00:00.000000000 Z
11
+ date: 2024-11-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: "[Unicode 16.0.0] Retrieve the Unicode script(s) a string belongs to.
14
14
  Can also return the Script_Extension property which is defined as characters which
@@ -54,7 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  requirements: []
57
- rubygems_version: 3.5.9
57
+ rubygems_version: 3.5.21
58
58
  signing_key:
59
59
  specification_version: 4
60
60
  summary: Which script(s) does a Unicode string belong to?