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 +4 -4
- data/CHANGELOG.md +94 -39
- data/Gemfile +5 -2
- data/Rakefile +11 -8
- data/addressable.gemspec +9 -18
- data/lib/addressable/idna/native.rb +8 -3
- data/lib/addressable/idna/pure.rb +10 -183
- data/lib/addressable/idna.rb +0 -1
- data/lib/addressable/template.rb +13 -15
- data/lib/addressable/uri.rb +231 -185
- data/lib/addressable/version.rb +1 -2
- data/spec/addressable/idna_spec.rb +6 -6
- data/spec/addressable/net_http_compat_spec.rb +0 -1
- data/spec/addressable/security_spec.rb +0 -1
- data/spec/addressable/template_spec.rb +69 -265
- data/spec/addressable/uri_spec.rb +176 -1
- data/tasks/gem.rake +7 -4
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62b62e368b9dffbec4c9aaf879257067698b83daff1cc13542352da419f3f88e
|
4
|
+
data.tar.gz: 7f3231aecc91ef0c3087ff2325d78e9a1f4c9f05a752f2c35c8f0bb740fd5996
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 670e1aeddc5a4f62ad39040007cef7371107237b2e4064755355dfbc43cfc62a956f78358c95793a9f55cd325b7b46ce532003bdd9711b1bc3c79b35e0d3cbf6
|
7
|
+
data.tar.gz: d7aed8469d926b0bcdd19202593f8bfa162d9dafb38dabca632ccee8af3fd26920dfbce3f18b674d583f5aaa2e7c51717ccf46fab3a1a4fb4a8dfbd74a80da16
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,59 @@
|
|
1
|
-
# Addressable 2.8.
|
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
|
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
|
-
|
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
|
-
"
|
24
|
-
"
|
25
|
-
"
|
26
|
-
|
27
|
-
|
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.
|
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.
|
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 = "
|
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.
|
20
|
-
s.rubygems_version = "3.
|
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
|
-
|
24
|
-
s.specification_version = 4
|
24
|
+
s.specification_version = 4
|
25
25
|
|
26
|
-
|
27
|
-
|
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
|
-
|
34
|
-
|
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(
|
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
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|