addressable 2.8.0 → 2.8.7

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: 03a21b1eab156a16e90bd7963af85980edfbddc8f3dbe052766303dba76cc000
4
- data.tar.gz: 03eca5d86f4c70f9320000f36e3cff4fd8023342a4e0ac855d0ef1ec89ee6183
3
+ metadata.gz: 62b62e368b9dffbec4c9aaf879257067698b83daff1cc13542352da419f3f88e
4
+ data.tar.gz: 7f3231aecc91ef0c3087ff2325d78e9a1f4c9f05a752f2c35c8f0bb740fd5996
5
5
  SHA512:
6
- metadata.gz: d504f9475ad823f5bb077b9c039a2c91c83e52c20896247a7289b61725c61b1ddefe8ae06155fb018fc67087cf04276081b42105a18394b45e2374ad0b2fadb0
7
- data.tar.gz: b81766fbcb9335d5ca94403b62d3b2a6fae31b66cd3c05f48e1885eaf07883bfa1321b6930271fe1415135aec687af51312a26ce27bd4b83b2ac6424dec597c9
6
+ metadata.gz: 670e1aeddc5a4f62ad39040007cef7371107237b2e4064755355dfbc43cfc62a956f78358c95793a9f55cd325b7b46ce532003bdd9711b1bc3c79b35e0d3cbf6
7
+ data.tar.gz: d7aed8469d926b0bcdd19202593f8bfa162d9dafb38dabca632ccee8af3fd26920dfbce3f18b674d583f5aaa2e7c51717ccf46fab3a1a4fb4a8dfbd74a80da16
data/CHANGELOG.md CHANGED
@@ -1,4 +1,59 @@
1
- # Addressable 2.8.0
1
+ # Addressable 2.8.7 <a name="v2.8.7">
2
+ - Allow `public_suffix` 6 ([#535])
3
+
4
+ [#535]: https://github.com/sporkmonger/addressable/pull/535
5
+
6
+ # Addressable 2.8.6 <a name="v2.8.6">
7
+ - Memoize regexps for common character classes ([#524])
8
+
9
+ [#524]: https://github.com/sporkmonger/addressable/pull/524
10
+
11
+ # Addressable 2.8.5 <a name="v2.8.5">
12
+ - Fix thread safety issue with encoding tables ([#515])
13
+ - Define URI::NONE as a module to avoid serialization issues ([#509])
14
+ - Fix YAML serialization ([#508])
15
+
16
+ [#508]: https://github.com/sporkmonger/addressable/pull/508
17
+ [#509]: https://github.com/sporkmonger/addressable/pull/509
18
+ [#515]: https://github.com/sporkmonger/addressable/pull/515
19
+
20
+ # Addressable 2.8.4 <a name="v2.8.4">
21
+ - Restore `Addressable::IDNA.unicode_normalize_kc` as a deprecated method ([#504])
22
+
23
+ [#504]: https://github.com/sporkmonger/addressable/pull/504
24
+
25
+ # Addressable 2.8.3 <a name="v2.8.3">
26
+ - Fix template expand level 2 hash support for non-string objects ([#499], [#498])
27
+
28
+ [#499]: https://github.com/sporkmonger/addressable/pull/499
29
+ [#498]: https://github.com/sporkmonger/addressable/pull/498
30
+
31
+ # Addressable 2.8.2 <a name="v2.8.2">
32
+ - Improve cache hits and JIT friendliness ([#486](https://github.com/sporkmonger/addressable/pull/486))
33
+ - Improve code style and test coverage ([#482](https://github.com/sporkmonger/addressable/pull/482))
34
+ - Ensure reset of deferred validation ([#481](https://github.com/sporkmonger/addressable/pull/481))
35
+ - Resolve normalization differences between `IDNA::Native` and `IDNA::Pure` ([#408](https://github.com/sporkmonger/addressable/issues/408), [#492])
36
+ - Remove redundant colon in `Addressable::URI::CharacterClasses::AUTHORITY` regex ([#438](https://github.com/sporkmonger/addressable/pull/438)) (accidentally reverted by [#449] merge but [added back](https://github.com/sporkmonger/addressable/pull/492#discussion_r1105125280) in [#492])
37
+
38
+ [#492]: https://github.com/sporkmonger/addressable/pull/492
39
+
40
+ # Addressable 2.8.1 <a name="v2.8.1">
41
+ - refactor `Addressable::URI.normalize_path` to address linter offenses ([#430](https://github.com/sporkmonger/addressable/pull/430))
42
+ - update gemspec to reflect supported Ruby versions ([#466], [#464], [#463])
43
+ - compatibility w/ public_suffix 5.x ([#466], [#465], [#460])
44
+ - fixes "invalid byte sequence in UTF-8" exception when unencoding URLs containing non UTF-8 characters ([#459](https://github.com/sporkmonger/addressable/pull/459))
45
+ - `Ractor` compatibility ([#449])
46
+ - use the whole string instead of a single line for template match ([#431](https://github.com/sporkmonger/addressable/pull/431))
47
+ - force UTF-8 encoding only if needed ([#341](https://github.com/sporkmonger/addressable/pull/341))
48
+
49
+ [#449]: https://github.com/sporkmonger/addressable/pull/449
50
+ [#460]: https://github.com/sporkmonger/addressable/pull/460
51
+ [#463]: https://github.com/sporkmonger/addressable/pull/463
52
+ [#464]: https://github.com/sporkmonger/addressable/pull/464
53
+ [#465]: https://github.com/sporkmonger/addressable/pull/465
54
+ [#466]: https://github.com/sporkmonger/addressable/pull/466
55
+
56
+ # Addressable 2.8.0 <a name="v2.8.0">
2
57
  - fixes ReDoS vulnerability in Addressable::Template#match
3
58
  - no longer replaces `+` with spaces in queries for non-http(s) schemes
4
59
  - fixed encoding ipv6 literals
@@ -10,14 +65,14 @@
10
65
  - performance improvements
11
66
  - switch CI/CD to GitHub Actions
12
67
 
13
- # Addressable 2.7.0
68
+ # Addressable 2.7.0 <a name="v2.7.0">
14
69
  - added `:compacted` flag to `normalized_query`
15
70
  - `heuristic_parse` handles `mailto:` more intuitively
16
71
  - dropped explicit support for JRuby 9.0.5.0
17
72
  - compatibility w/ public_suffix 4.x
18
73
  - performance improvements
19
74
 
20
- # Addressable 2.6.0
75
+ # Addressable 2.6.0 <a name="v2.6.0">
21
76
  - added `tld=` method to allow assignment to the public suffix
22
77
  - most `heuristic_parse` patterns are now case-insensitive
23
78
  - `heuristic_parse` handles more `file://` URI variations
@@ -28,17 +83,17 @@
28
83
  - minor performance improvements in regexps
29
84
  - fixes to eliminate warnings
30
85
 
31
- # Addressable 2.5.2
86
+ # Addressable 2.5.2 <a name="v2.5.2">
32
87
  - better support for frozen string literals
33
88
  - fixed bug w/ uppercase characters in scheme
34
89
  - IDNA errors w/ emoji URLs
35
90
  - compatibility w/ public_suffix 3.x
36
91
 
37
- # Addressable 2.5.1
92
+ # Addressable 2.5.1 <a name="v2.5.1">
38
93
  - allow unicode normalization to be disabled for URI Template expansion
39
94
  - removed duplicate test
40
95
 
41
- # Addressable 2.5.0
96
+ # Addressable 2.5.0 <a name="v2.5.0">
42
97
  - dropping support for Ruby 1.9
43
98
  - adding support for Ruby 2.4 preview
44
99
  - add support for public suffixes and tld; first runtime dependency
@@ -52,7 +107,7 @@
52
107
  - host parts longer than 63 bytes will be ignored and not passed to libidn
53
108
  - normalized values always encoded as UTF-8
54
109
 
55
- # Addressable 2.4.0
110
+ # Addressable 2.4.0 <a name="v2.4.0">
56
111
  - support for 1.8.x dropped
57
112
  - double quotes in a host now raises an error
58
113
  - newlines in host will no longer get unescaped during normalization
@@ -64,17 +119,17 @@
64
119
  - fixed minor bug where an exception would be thrown for a missing ACE suffix
65
120
  - better partial expansion of URI templates
66
121
 
67
- # Addressable 2.3.8
122
+ # Addressable 2.3.8 <a name="v2.3.8">
68
123
  - fix warnings
69
124
  - update dependency gems
70
125
  - support for 1.8.x officially deprecated
71
126
 
72
- # Addressable 2.3.7
127
+ # Addressable 2.3.7 <a name="v2.3.7">
73
128
  - fix scenario in which invalid URIs don't get an exception until inspected
74
129
  - handle hostnames with two adjacent periods correctly
75
130
  - upgrade of RSpec
76
131
 
77
- # Addressable 2.3.6
132
+ # Addressable 2.3.6 <a name="v2.3.6">
78
133
  - normalization drops empty query string
79
134
  - better handling in template extract for missing values
80
135
  - template modifier for `'?'` now treated as optional
@@ -83,19 +138,19 @@
83
138
  - added `:sorted` option to normalization of query strings
84
139
  - fixed issue with normalization of hosts given in `'example.com.'` form
85
140
 
86
- # Addressable 2.3.5
141
+ # Addressable 2.3.5 <a name="v2.3.5">
87
142
  - added Addressable::URI#empty? method
88
143
  - Addressable::URI#hostname methods now strip square brackets from IPv6 hosts
89
144
  - compatibility with Net::HTTP in Ruby 2.0.0
90
145
  - Addressable::URI#route_from should always give relative URIs
91
146
 
92
- # Addressable 2.3.4
147
+ # Addressable 2.3.4 <a name="v2.3.4">
93
148
  - fixed issue with encoding altering its inputs
94
149
  - query string normalization now leaves ';' characters alone
95
150
  - FakeFS is detected before attempting to load unicode tables
96
151
  - additional testing to ensure frozen objects don't cause problems
97
152
 
98
- # Addressable 2.3.3
153
+ # Addressable 2.3.3 <a name="v2.3.3">
99
154
  - fixed issue with converting common primitives during template expansion
100
155
  - fixed port encoding issue
101
156
  - removed a few warnings
@@ -104,59 +159,59 @@
104
159
  - no template match should now result in nil instead of an empty MatchData
105
160
  - added license information to gemspec
106
161
 
107
- # Addressable 2.3.2
162
+ # Addressable 2.3.2 <a name="v2.3.2">
108
163
  - added Addressable::URI#default_port method
109
164
  - fixed issue with Marshalling Unicode data on Windows
110
165
  - improved heuristic parsing to better handle IPv4 addresses
111
166
 
112
- # Addressable 2.3.1
167
+ # Addressable 2.3.1 <a name="v2.3.1">
113
168
  - fixed missing unicode data file
114
169
 
115
- # Addressable 2.3.0
170
+ # Addressable 2.3.0 <a name="v2.3.0">
116
171
  - updated Addressable::Template to use RFC 6570, level 4
117
172
  - fixed compatibility problems with some versions of Ruby
118
173
  - moved unicode tables into a data file for performance reasons
119
174
  - removing support for multiple query value notations
120
175
 
121
- # Addressable 2.2.8
176
+ # Addressable 2.2.8 <a name="v2.2.8">
122
177
  - fixed issues with dot segment removal code
123
178
  - form encoding can now handle multiple values per key
124
179
  - updated development environment
125
180
 
126
- # Addressable 2.2.7
181
+ # Addressable 2.2.7 <a name="v2.2.7">
127
182
  - fixed issues related to Addressable::URI#query_values=
128
183
  - the Addressable::URI.parse method is now polymorphic
129
184
 
130
- # Addressable 2.2.6
185
+ # Addressable 2.2.6 <a name="v2.2.6">
131
186
  - changed the way ambiguous paths are handled
132
187
  - fixed bug with frozen URIs
133
188
  - https supported in heuristic parsing
134
189
 
135
- # Addressable 2.2.5
190
+ # Addressable 2.2.5 <a name="v2.2.5">
136
191
  - 'parsing' a pre-parsed URI object is now a dup operation
137
192
  - introduced conditional support for libidn
138
193
  - fixed normalization issue on ampersands in query strings
139
194
  - added additional tests around handling of query strings
140
195
 
141
- # Addressable 2.2.4
196
+ # Addressable 2.2.4 <a name="v2.2.4">
142
197
  - added origin support from draft-ietf-websec-origin-00
143
198
  - resolved issue with attempting to navigate below root
144
199
  - fixed bug with string splitting in query strings
145
200
 
146
- # Addressable 2.2.3
201
+ # Addressable 2.2.3 <a name="v2.2.3">
147
202
  - added :flat_array notation for query strings
148
203
 
149
- # Addressable 2.2.2
204
+ # Addressable 2.2.2 <a name="v2.2.2">
150
205
  - fixed issue with percent escaping of '+' character in query strings
151
206
 
152
- # Addressable 2.2.1
207
+ # Addressable 2.2.1 <a name="v2.2.1">
153
208
  - added support for application/x-www-form-urlencoded.
154
209
 
155
- # Addressable 2.2.0
210
+ # Addressable 2.2.0 <a name="v2.2.0">
156
211
  - added site methods
157
212
  - improved documentation
158
213
 
159
- # Addressable 2.1.2
214
+ # Addressable 2.1.2 <a name="v2.1.2">
160
215
  - added HTTP request URI methods
161
216
  - better handling of Windows file paths
162
217
  - validation_deferred boolean replaced with defer_validation block
@@ -164,14 +219,14 @@
164
219
  - fixed issue with constructing URIs with relative paths
165
220
  - fixed warnings
166
221
 
167
- # Addressable 2.1.1
222
+ # Addressable 2.1.1 <a name="v2.1.1">
168
223
  - more type checking changes
169
224
  - fixed issue with unicode normalization
170
225
  - added method to find template defaults
171
226
  - symbolic keys are now allowed in template mappings
172
227
  - numeric values and symbolic values are now allowed in template mappings
173
228
 
174
- # Addressable 2.1.0
229
+ # Addressable 2.1.0 <a name="v2.1.0">
175
230
  - refactored URI template support out into its own class
176
231
  - removed extract method due to being useless and unreliable
177
232
  - removed Addressable::URI.expand_template
@@ -185,15 +240,15 @@
185
240
  - worked around issue with freezing URIs
186
241
  - improved specs
187
242
 
188
- # Addressable 2.0.2
243
+ # Addressable 2.0.2 <a name="v2.0.2">
189
244
  - fixed issue with URI template expansion
190
245
  - fixed issue with percent escaping characters 0-15
191
246
 
192
- # Addressable 2.0.1
247
+ # Addressable 2.0.1 <a name="v2.0.1">
193
248
  - fixed issue with query string assignment
194
249
  - fixed issue with improperly encoded components
195
250
 
196
- # Addressable 2.0.0
251
+ # Addressable 2.0.0 <a name="v2.0.0">
197
252
  - the initialize method now takes an options hash as its only parameter
198
253
  - added query_values method to URI class
199
254
  - completely replaced IDNA implementation with pure Ruby
@@ -208,20 +263,20 @@
208
263
  - updated URI Template code to match v 03 of the draft spec
209
264
  - added a bunch of new specifications
210
265
 
211
- # Addressable 1.0.4
266
+ # Addressable 1.0.4 <a name="v1.0.4">
212
267
  - switched to using RSpec's pending system for specs that rely on IDN
213
268
  - fixed issue with creating URIs with paths that are not prefixed with '/'
214
269
 
215
- # Addressable 1.0.3
270
+ # Addressable 1.0.3 <a name="v1.0.3">
216
271
  - implemented a hash method
217
272
 
218
- # Addressable 1.0.2
273
+ # Addressable 1.0.2 <a name="v1.0.2">
219
274
  - fixed minor bug with the extract_mapping method
220
275
 
221
- # Addressable 1.0.1
276
+ # Addressable 1.0.1 <a name="v1.0.1">
222
277
  - fixed minor bug with the extract_mapping method
223
278
 
224
- # Addressable 1.0.0
279
+ # Addressable 1.0.0 <a name="v1.0.0">
225
280
  - heuristic parse method added
226
281
  - parsing is slightly more strict
227
282
  - replaced to_h with to_hash
@@ -230,16 +285,16 @@
230
285
  - improved heckle rake task
231
286
  - no surviving heckle mutations
232
287
 
233
- # Addressable 0.1.2
288
+ # Addressable 0.1.2 <a name="v0.1.2">
234
289
  - improved normalization
235
290
  - fixed bug in joining algorithm
236
291
  - updated specifications
237
292
 
238
- # Addressable 0.1.1
293
+ # Addressable 0.1.1 <a name="v0.1.1">
239
294
  - updated documentation
240
295
  - added URI Template variable extraction
241
296
 
242
- # Addressable 0.1.0
297
+ # Addressable 0.1.0 <a name="v0.1.0">
243
298
  - initial release
244
299
  - implementation based on RFC 3986, 3987
245
300
  - support for IRIs via libidn
data/Gemfile CHANGED
@@ -2,9 +2,10 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- gemspec(path: __FILE__ == "(eval)" ? ".." : ".")
5
+ gemspec
6
6
 
7
7
  group :test do
8
+ gem 'bigdecimal' if RUBY_VERSION > '2.4'
8
9
  gem 'rspec', '~> 3.8'
9
10
  gem 'rspec-its', '~> 1.3'
10
11
  end
@@ -25,4 +26,6 @@ group :test, :development do
25
26
  gem "rake", ">= 12.3.3"
26
27
  end
27
28
 
28
- gem "idn-ruby", platform: :mri
29
+ unless ENV["IDNA_MODE"] == "pure"
30
+ gem "idn-ruby", platform: :mri
31
+ end
data/Rakefile CHANGED
@@ -20,15 +20,18 @@ additionally provides extensive support for IRIs and URI templates.
20
20
  TEXT
21
21
 
22
22
  PKG_FILES = FileList[
23
- "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*",
24
- "tasks/**/*",
25
- "[A-Z]*", "Rakefile"
26
- ].exclude(/pkg/).exclude(/database\.yml/).
27
- exclude(/Gemfile\.lock/).exclude(/[_\.]git$/)
23
+ "data/**/*",
24
+ "lib/**/*.rb",
25
+ "spec/**/*.rb",
26
+ "tasks/**/*.rake",
27
+ "addressable.gemspec",
28
+ "CHANGELOG.md",
29
+ "Gemfile",
30
+ "LICENSE.txt",
31
+ "README.md",
32
+ "Rakefile",
33
+ ]
28
34
 
29
35
  task :default => "spec"
30
36
 
31
- WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false
32
- SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
33
-
34
37
  Dir['tasks/**/*.rake'].each { |rake| load rake }
data/addressable.gemspec CHANGED
@@ -1,14 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: addressable 2.8.0 ruby lib
2
+ # stub: addressable 2.8.7 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "addressable".freeze
6
- s.version = "2.8.0"
6
+ s.version = "2.8.7".freeze
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
+ s.metadata = { "changelog_uri" => "https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md#v2.8.7" } if s.respond_to? :metadata=
9
10
  s.require_paths = ["lib".freeze]
10
11
  s.authors = ["Bob Aman".freeze]
11
- s.date = "2021-07-03"
12
+ s.date = "2024-06-21"
12
13
  s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze
13
14
  s.email = "bob@sporkmonger.com".freeze
14
15
  s.extra_rdoc_files = ["README.md".freeze]
@@ -16,22 +17,12 @@ Gem::Specification.new do |s|
16
17
  s.homepage = "https://github.com/sporkmonger/addressable".freeze
17
18
  s.licenses = ["Apache-2.0".freeze]
18
19
  s.rdoc_options = ["--main".freeze, "README.md".freeze]
19
- s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
20
- s.rubygems_version = "3.0.3".freeze
20
+ s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze)
21
+ s.rubygems_version = "3.5.11".freeze
21
22
  s.summary = "URI Implementation".freeze
22
23
 
23
- if s.respond_to? :specification_version then
24
- s.specification_version = 4
24
+ s.specification_version = 4
25
25
 
26
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
- s.add_runtime_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
28
- s.add_development_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
29
- else
30
- s.add_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
31
- s.add_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
32
- end
33
- else
34
- s.add_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
35
- s.add_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
36
- end
26
+ s.add_runtime_dependency(%q<public_suffix>.freeze, [">= 2.0.2".freeze, "< 7.0".freeze])
27
+ s.add_development_dependency(%q<bundler>.freeze, [">= 1.0".freeze, "< 3.0".freeze])
37
28
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # encoding:utf-8
4
3
  #--
5
4
  # Copyright (C) Bob Aman
6
5
  #
@@ -30,8 +29,14 @@ module Addressable
30
29
  IDN::Punycode.decode(value.to_s)
31
30
  end
32
31
 
33
- def self.unicode_normalize_kc(value)
34
- IDN::Stringprep.nfkc_normalize(value.to_s)
32
+ class << self
33
+ # @deprecated Use {String#unicode_normalize(:nfkc)} instead
34
+ def unicode_normalize_kc(value)
35
+ value.to_s.unicode_normalize(:nfkc)
36
+ end
37
+
38
+ extend Gem::Deprecate
39
+ deprecate :unicode_normalize_kc, "String#unicode_normalize(:nfkc)", 2023, 4
35
40
  end
36
41
 
37
42
  def self.to_ascii(value)
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # encoding:utf-8
4
3
  #--
5
4
  # Copyright (C) Bob Aman
6
5
  #
@@ -67,7 +66,7 @@ module Addressable
67
66
  # domain name as described in RFC 3490.
68
67
  def self.to_ascii(input)
69
68
  input = input.to_s unless input.is_a?(String)
70
- input = input.dup
69
+ input = input.dup.force_encoding(Encoding::UTF_8).unicode_normalize(:nfkc)
71
70
  if input.respond_to?(:force_encoding)
72
71
  input.force_encoding(Encoding::ASCII_8BIT)
73
72
  end
@@ -78,7 +77,7 @@ module Addressable
78
77
  part.force_encoding(Encoding::ASCII_8BIT)
79
78
  end
80
79
  if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE
81
- ACE_PREFIX + punycode_encode(unicode_normalize_kc(part))
80
+ ACE_PREFIX + punycode_encode(part)
82
81
  else
83
82
  part
84
83
  end
@@ -113,13 +112,14 @@ module Addressable
113
112
  output
114
113
  end
115
114
 
116
- # Unicode normalization form KC.
117
- def self.unicode_normalize_kc(input)
118
- input = input.to_s unless input.is_a?(String)
119
- unpacked = input.unpack("U*")
120
- unpacked =
121
- unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked)))
122
- return unpacked.pack("U*")
115
+ class << self
116
+ # @deprecated Use {String#unicode_normalize(:nfkc)} instead
117
+ def unicode_normalize_kc(value)
118
+ value.to_s.unicode_normalize(:nfkc)
119
+ end
120
+
121
+ extend Gem::Deprecate
122
+ deprecate :unicode_normalize_kc, "String#unicode_normalize(:nfkc)", 2023, 4
123
123
  end
124
124
 
125
125
  ##
@@ -137,164 +137,6 @@ module Addressable
137
137
  end
138
138
  private_class_method :unicode_downcase
139
139
 
140
- def self.unicode_compose(unpacked)
141
- unpacked_result = []
142
- length = unpacked.length
143
-
144
- return unpacked if length == 0
145
-
146
- starter = unpacked[0]
147
- starter_cc = lookup_unicode_combining_class(starter)
148
- starter_cc = 256 if starter_cc != 0
149
- for i in 1...length
150
- ch = unpacked[i]
151
-
152
- if (starter_cc == 0 &&
153
- (composite = unicode_compose_pair(starter, ch)) != nil)
154
- starter = composite
155
- else
156
- unpacked_result << starter
157
- starter = ch
158
- end
159
- end
160
- unpacked_result << starter
161
- return unpacked_result
162
- end
163
- private_class_method :unicode_compose
164
-
165
- def self.unicode_compose_pair(ch_one, ch_two)
166
- if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT &&
167
- ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT
168
- # Hangul L + V
169
- return HANGUL_SBASE + (
170
- (ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE)
171
- ) * HANGUL_TCOUNT
172
- elsif ch_one >= HANGUL_SBASE &&
173
- ch_one < HANGUL_SBASE + HANGUL_SCOUNT &&
174
- (ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 &&
175
- ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT
176
- # Hangul LV + T
177
- return ch_one + (ch_two - HANGUL_TBASE)
178
- end
179
-
180
- p = []
181
-
182
- ucs4_to_utf8(ch_one, p)
183
- ucs4_to_utf8(ch_two, p)
184
-
185
- return lookup_unicode_composition(p)
186
- end
187
- private_class_method :unicode_compose_pair
188
-
189
- def self.ucs4_to_utf8(char, buffer)
190
- if char < 128
191
- buffer << char
192
- elsif char < 2048
193
- buffer << (char >> 6 | 192)
194
- buffer << (char & 63 | 128)
195
- elsif char < 0x10000
196
- buffer << (char >> 12 | 224)
197
- buffer << (char >> 6 & 63 | 128)
198
- buffer << (char & 63 | 128)
199
- elsif char < 0x200000
200
- buffer << (char >> 18 | 240)
201
- buffer << (char >> 12 & 63 | 128)
202
- buffer << (char >> 6 & 63 | 128)
203
- buffer << (char & 63 | 128)
204
- elsif char < 0x4000000
205
- buffer << (char >> 24 | 248)
206
- buffer << (char >> 18 & 63 | 128)
207
- buffer << (char >> 12 & 63 | 128)
208
- buffer << (char >> 6 & 63 | 128)
209
- buffer << (char & 63 | 128)
210
- elsif char < 0x80000000
211
- buffer << (char >> 30 | 252)
212
- buffer << (char >> 24 & 63 | 128)
213
- buffer << (char >> 18 & 63 | 128)
214
- buffer << (char >> 12 & 63 | 128)
215
- buffer << (char >> 6 & 63 | 128)
216
- buffer << (char & 63 | 128)
217
- end
218
- end
219
- private_class_method :ucs4_to_utf8
220
-
221
- def self.unicode_sort_canonical(unpacked)
222
- unpacked = unpacked.dup
223
- i = 1
224
- length = unpacked.length
225
-
226
- return unpacked if length < 2
227
-
228
- while i < length
229
- last = unpacked[i-1]
230
- ch = unpacked[i]
231
- last_cc = lookup_unicode_combining_class(last)
232
- cc = lookup_unicode_combining_class(ch)
233
- if cc != 0 && last_cc != 0 && last_cc > cc
234
- unpacked[i] = last
235
- unpacked[i-1] = ch
236
- i -= 1 if i > 1
237
- else
238
- i += 1
239
- end
240
- end
241
- return unpacked
242
- end
243
- private_class_method :unicode_sort_canonical
244
-
245
- def self.unicode_decompose(unpacked)
246
- unpacked_result = []
247
- for cp in unpacked
248
- if cp >= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT
249
- l, v, t = unicode_decompose_hangul(cp)
250
- unpacked_result << l
251
- unpacked_result << v if v
252
- unpacked_result << t if t
253
- else
254
- dc = lookup_unicode_compatibility(cp)
255
- unless dc
256
- unpacked_result << cp
257
- else
258
- unpacked_result.concat(unicode_decompose(dc.unpack("U*")))
259
- end
260
- end
261
- end
262
- return unpacked_result
263
- end
264
- private_class_method :unicode_decompose
265
-
266
- def self.unicode_decompose_hangul(codepoint)
267
- sindex = codepoint - HANGUL_SBASE;
268
- if sindex < 0 || sindex >= HANGUL_SCOUNT
269
- l = codepoint
270
- v = t = nil
271
- return l, v, t
272
- end
273
- l = HANGUL_LBASE + sindex / HANGUL_NCOUNT
274
- v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT
275
- t = HANGUL_TBASE + sindex % HANGUL_TCOUNT
276
- if t == HANGUL_TBASE
277
- t = nil
278
- end
279
- return l, v, t
280
- end
281
- private_class_method :unicode_decompose_hangul
282
-
283
- def self.lookup_unicode_combining_class(codepoint)
284
- codepoint_data = UNICODE_DATA[codepoint]
285
- (codepoint_data ?
286
- (codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) :
287
- 0)
288
- end
289
- private_class_method :lookup_unicode_combining_class
290
-
291
- def self.lookup_unicode_compatibility(codepoint)
292
- codepoint_data = UNICODE_DATA[codepoint]
293
- (codepoint_data ?
294
- codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil)
295
- end
296
- private_class_method :lookup_unicode_compatibility
297
-
298
140
  def self.lookup_unicode_lowercase(codepoint)
299
141
  codepoint_data = UNICODE_DATA[codepoint]
300
142
  (codepoint_data ?
@@ -303,21 +145,6 @@ module Addressable
303
145
  end
304
146
  private_class_method :lookup_unicode_lowercase
305
147
 
306
- def self.lookup_unicode_composition(unpacked)
307
- return COMPOSITION_TABLE[unpacked]
308
- end
309
- private_class_method :lookup_unicode_composition
310
-
311
- HANGUL_SBASE = 0xac00
312
- HANGUL_LBASE = 0x1100
313
- HANGUL_LCOUNT = 19
314
- HANGUL_VBASE = 0x1161
315
- HANGUL_VCOUNT = 21
316
- HANGUL_TBASE = 0x11a7
317
- HANGUL_TCOUNT = 28
318
- HANGUL_NCOUNT = HANGUL_VCOUNT * HANGUL_TCOUNT # 588
319
- HANGUL_SCOUNT = HANGUL_LCOUNT * HANGUL_NCOUNT # 11172
320
-
321
148
  UNICODE_DATA_COMBINING_CLASS = 0
322
149
  UNICODE_DATA_EXCLUSION = 1
323
150
  UNICODE_DATA_CANONICAL = 2
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # encoding:utf-8
4
3
  #--
5
4
  # Copyright (C) Bob Aman
6
5
  #