addressable 2.3.2 → 2.9.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ffaab8b78df30a2126058a425f168d76b26bc33e60849cabc1a6beabae24464d
4
+ data.tar.gz: 841ab2bd18fbcf3ff746cb85ea1661e628e278e6c7bc5ad96cd480e36a54f067
5
+ SHA512:
6
+ metadata.gz: f5884313cb2c68ea73d25e8f7f0a76200030bb3fb7abad8b31532180b1ae3c1df10f8db614a273dba115c87860682d227fdf046c743370e020a577cae667d026
7
+ data.tar.gz: c97dd91446991ce20400e9b4c2586aefbc1dca9fd1d49efca9606fc505ff0d49807686ab1fdfd7d4dba447c9c4bf8fb6c0bbd5a1d3d69a4952207d035e912dc2
data/CHANGELOG.md CHANGED
@@ -1,56 +1,242 @@
1
- # Addressable 2.3.2
1
+ # Changelog
2
+
3
+ ## Addressable 2.9.0 <a name="v2.9.0">
4
+ - fixes ReDoS vulnerability in Addressable::Template#match (fixes incomplete
5
+ remediation in 2.8.10)
6
+
7
+ ## Addressable 2.8.10 <a name="v2.8.10">
8
+ - fixes ReDoS vulnerability in Addressable::Template#match
9
+
10
+ ## Addressable 2.8.9 <a name="v2.8.9">
11
+ - Reduce gem size by excluding test files ([#569])
12
+ - No need for bundler as development dependency ([#571], [5fc1d93](https://github.com/sporkmonger/addressable/commit/5fc1d93))
13
+ - idna/pure: stop building the useless `COMPOSITION_TABLE` (removes the `Addressable::IDNA::COMPOSITION_TABLE` constant) ([#564])
14
+
15
+ [#569]: https://github.com/sporkmonger/addressable/pull/569
16
+ [#571]: https://github.com/sporkmonger/addressable/pull/571
17
+ [#564]: https://github.com/sporkmonger/addressable/pull/564
18
+
19
+ ## Addressable 2.8.8 <a name="v2.8.8">
20
+ - Replace the `unicode.data` blob by a ruby constant ([#561])
21
+ - Allow `public_suffix` 7 ([#558])
22
+
23
+ [#561]: https://github.com/sporkmonger/addressable/pull/561
24
+ [#558]: https://github.com/sporkmonger/addressable/pull/558
25
+
26
+ ## Addressable 2.8.7 <a name="v2.8.7">
27
+ - Allow `public_suffix` 6 ([#535])
28
+
29
+ [#535]: https://github.com/sporkmonger/addressable/pull/535
30
+
31
+ ## Addressable 2.8.6 <a name="v2.8.6">
32
+ - Memoize regexps for common character classes ([#524])
33
+
34
+ [#524]: https://github.com/sporkmonger/addressable/pull/524
35
+
36
+ ## Addressable 2.8.5 <a name="v2.8.5">
37
+ - Fix thread safety issue with encoding tables ([#515])
38
+ - Define URI::NONE as a module to avoid serialization issues ([#509])
39
+ - Fix YAML serialization ([#508])
40
+
41
+ [#508]: https://github.com/sporkmonger/addressable/pull/508
42
+ [#509]: https://github.com/sporkmonger/addressable/pull/509
43
+ [#515]: https://github.com/sporkmonger/addressable/pull/515
44
+
45
+ ## Addressable 2.8.4 <a name="v2.8.4">
46
+ - Restore `Addressable::IDNA.unicode_normalize_kc` as a deprecated method ([#504])
47
+
48
+ [#504]: https://github.com/sporkmonger/addressable/pull/504
49
+
50
+ ## Addressable 2.8.3 <a name="v2.8.3">
51
+ - Fix template expand level 2 hash support for non-string objects ([#499], [#498])
52
+
53
+ [#499]: https://github.com/sporkmonger/addressable/pull/499
54
+ [#498]: https://github.com/sporkmonger/addressable/pull/498
55
+
56
+ ## Addressable 2.8.2 <a name="v2.8.2">
57
+ - Improve cache hits and JIT friendliness ([#486](https://github.com/sporkmonger/addressable/pull/486))
58
+ - Improve code style and test coverage ([#482](https://github.com/sporkmonger/addressable/pull/482))
59
+ - Ensure reset of deferred validation ([#481](https://github.com/sporkmonger/addressable/pull/481))
60
+ - Resolve normalization differences between `IDNA::Native` and `IDNA::Pure` ([#408](https://github.com/sporkmonger/addressable/issues/408), [#492])
61
+ - 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])
62
+
63
+ [#492]: https://github.com/sporkmonger/addressable/pull/492
64
+
65
+ ## Addressable 2.8.1 <a name="v2.8.1">
66
+ - refactor `Addressable::URI.normalize_path` to address linter offenses ([#430](https://github.com/sporkmonger/addressable/pull/430))
67
+ - update gemspec to reflect supported Ruby versions ([#466], [#464], [#463])
68
+ - compatibility w/ public_suffix 5.x ([#466], [#465], [#460])
69
+ - fixes "invalid byte sequence in UTF-8" exception when unencoding URLs containing non UTF-8 characters ([#459](https://github.com/sporkmonger/addressable/pull/459))
70
+ - `Ractor` compatibility ([#449])
71
+ - use the whole string instead of a single line for template match ([#431](https://github.com/sporkmonger/addressable/pull/431))
72
+ - force UTF-8 encoding only if needed ([#341](https://github.com/sporkmonger/addressable/pull/341))
73
+
74
+ [#449]: https://github.com/sporkmonger/addressable/pull/449
75
+ [#460]: https://github.com/sporkmonger/addressable/pull/460
76
+ [#463]: https://github.com/sporkmonger/addressable/pull/463
77
+ [#464]: https://github.com/sporkmonger/addressable/pull/464
78
+ [#465]: https://github.com/sporkmonger/addressable/pull/465
79
+ [#466]: https://github.com/sporkmonger/addressable/pull/466
80
+
81
+ ## Addressable 2.8.0 <a name="v2.8.0">
82
+ - fixes ReDoS vulnerability in Addressable::Template#match
83
+ - no longer replaces `+` with spaces in queries for non-http(s) schemes
84
+ - fixed encoding ipv6 literals
85
+ - the `:compacted` flag for `normalized_query` now dedupes parameters
86
+ - fix broken `escape_component` alias
87
+ - dropping support for Ruby 2.0 and 2.1
88
+ - adding Ruby 3.0 compatibility for development tasks
89
+ - drop support for `rack-mount` and remove Addressable::Template#generate
90
+ - performance improvements
91
+ - switch CI/CD to GitHub Actions
92
+
93
+ ## Addressable 2.7.0 <a name="v2.7.0">
94
+ - added `:compacted` flag to `normalized_query`
95
+ - `heuristic_parse` handles `mailto:` more intuitively
96
+ - dropped explicit support for JRuby 9.0.5.0
97
+ - compatibility w/ public_suffix 4.x
98
+ - performance improvements
99
+
100
+ ## Addressable 2.6.0 <a name="v2.6.0">
101
+ - added `tld=` method to allow assignment to the public suffix
102
+ - most `heuristic_parse` patterns are now case-insensitive
103
+ - `heuristic_parse` handles more `file://` URI variations
104
+ - fixes bug in `heuristic_parse` when uri starts with digit
105
+ - fixes bug in `request_uri=` with query strings
106
+ - fixes template issues with `nil` and `?` operator
107
+ - `frozen_string_literal` pragmas added
108
+ - minor performance improvements in regexps
109
+ - fixes to eliminate warnings
110
+
111
+ ## Addressable 2.5.2 <a name="v2.5.2">
112
+ - better support for frozen string literals
113
+ - fixed bug w/ uppercase characters in scheme
114
+ - IDNA errors w/ emoji URLs
115
+ - compatibility w/ public_suffix 3.x
116
+
117
+ ## Addressable 2.5.1 <a name="v2.5.1">
118
+ - allow unicode normalization to be disabled for URI Template expansion
119
+ - removed duplicate test
120
+
121
+ ## Addressable 2.5.0 <a name="v2.5.0">
122
+ - dropping support for Ruby 1.9
123
+ - adding support for Ruby 2.4 preview
124
+ - add support for public suffixes and tld; first runtime dependency
125
+ - hostname escaping should match RFC; underscores in hostnames no longer escaped
126
+ - paths beginning with // and missing an authority are now considered invalid
127
+ - validation now also takes place after setting a path
128
+ - handle backslashes in authority more like a browser for `heuristic_parse`
129
+ - unescaped backslashes in host now raise an `InvalidURIError`
130
+ - `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation
131
+ - `heuristic_parse` now trims whitespace before parsing
132
+ - host parts longer than 63 bytes will be ignored and not passed to libidn
133
+ - normalized values always encoded as UTF-8
134
+
135
+ ## Addressable 2.4.0 <a name="v2.4.0">
136
+ - support for 1.8.x dropped
137
+ - double quotes in a host now raises an error
138
+ - newlines in host will no longer get unescaped during normalization
139
+ - stricter handling of bogus scheme values
140
+ - stricter handling of encoded port values
141
+ - calling `require 'addressable'` will now load both the URI and Template files
142
+ - assigning to the `hostname` component with an `IPAddr` object is now supported
143
+ - assigning to the `origin` component is now supported
144
+ - fixed minor bug where an exception would be thrown for a missing ACE suffix
145
+ - better partial expansion of URI templates
146
+
147
+ ## Addressable 2.3.8 <a name="v2.3.8">
148
+ - fix warnings
149
+ - update dependency gems
150
+ - support for 1.8.x officially deprecated
151
+
152
+ ## Addressable 2.3.7 <a name="v2.3.7">
153
+ - fix scenario in which invalid URIs don't get an exception until inspected
154
+ - handle hostnames with two adjacent periods correctly
155
+ - upgrade of RSpec
156
+
157
+ ## Addressable 2.3.6 <a name="v2.3.6">
158
+ - normalization drops empty query string
159
+ - better handling in template extract for missing values
160
+ - template modifier for `'?'` now treated as optional
161
+ - fixed issue where character class parameters were modified
162
+ - templates can now be tested for equality
163
+ - added `:sorted` option to normalization of query strings
164
+ - fixed issue with normalization of hosts given in `'example.com.'` form
165
+
166
+ ## Addressable 2.3.5 <a name="v2.3.5">
167
+ - added Addressable::URI#empty? method
168
+ - Addressable::URI#hostname methods now strip square brackets from IPv6 hosts
169
+ - compatibility with Net::HTTP in Ruby 2.0.0
170
+ - Addressable::URI#route_from should always give relative URIs
171
+
172
+ ## Addressable 2.3.4 <a name="v2.3.4">
173
+ - fixed issue with encoding altering its inputs
174
+ - query string normalization now leaves ';' characters alone
175
+ - FakeFS is detected before attempting to load unicode tables
176
+ - additional testing to ensure frozen objects don't cause problems
177
+
178
+ ## Addressable 2.3.3 <a name="v2.3.3">
179
+ - fixed issue with converting common primitives during template expansion
180
+ - fixed port encoding issue
181
+ - removed a few warnings
182
+ - normalize should now ignore %2B in query strings
183
+ - the IDNA logic should now be handled by libidn in Ruby 1.9
184
+ - no template match should now result in nil instead of an empty MatchData
185
+ - added license information to gemspec
186
+
187
+ ## Addressable 2.3.2 <a name="v2.3.2">
2
188
  - added Addressable::URI#default_port method
3
189
  - fixed issue with Marshalling Unicode data on Windows
4
190
  - improved heuristic parsing to better handle IPv4 addresses
5
191
 
6
- # Addressable 2.3.1
192
+ ## Addressable 2.3.1 <a name="v2.3.1">
7
193
  - fixed missing unicode data file
8
194
 
9
- # Addressable 2.3.0
195
+ ## Addressable 2.3.0 <a name="v2.3.0">
10
196
  - updated Addressable::Template to use RFC 6570, level 4
11
197
  - fixed compatibility problems with some versions of Ruby
12
198
  - moved unicode tables into a data file for performance reasons
13
199
  - removing support for multiple query value notations
14
200
 
15
- # Addressable 2.2.8
201
+ ## Addressable 2.2.8 <a name="v2.2.8">
16
202
  - fixed issues with dot segment removal code
17
203
  - form encoding can now handle multiple values per key
18
204
  - updated development environment
19
205
 
20
- # Addressable 2.2.7
206
+ ## Addressable 2.2.7 <a name="v2.2.7">
21
207
  - fixed issues related to Addressable::URI#query_values=
22
208
  - the Addressable::URI.parse method is now polymorphic
23
209
 
24
- # Addressable 2.2.6
210
+ ## Addressable 2.2.6 <a name="v2.2.6">
25
211
  - changed the way ambiguous paths are handled
26
212
  - fixed bug with frozen URIs
27
213
  - https supported in heuristic parsing
28
214
 
29
- # Addressable 2.2.5
215
+ ## Addressable 2.2.5 <a name="v2.2.5">
30
216
  - 'parsing' a pre-parsed URI object is now a dup operation
31
217
  - introduced conditional support for libidn
32
218
  - fixed normalization issue on ampersands in query strings
33
219
  - added additional tests around handling of query strings
34
220
 
35
- # Addressable 2.2.4
221
+ ## Addressable 2.2.4 <a name="v2.2.4">
36
222
  - added origin support from draft-ietf-websec-origin-00
37
223
  - resolved issue with attempting to navigate below root
38
224
  - fixed bug with string splitting in query strings
39
225
 
40
- # Addressable 2.2.3
226
+ ## Addressable 2.2.3 <a name="v2.2.3">
41
227
  - added :flat_array notation for query strings
42
228
 
43
- # Addressable 2.2.2
229
+ ## Addressable 2.2.2 <a name="v2.2.2">
44
230
  - fixed issue with percent escaping of '+' character in query strings
45
231
 
46
- # Addressable 2.2.1
232
+ ## Addressable 2.2.1 <a name="v2.2.1">
47
233
  - added support for application/x-www-form-urlencoded.
48
234
 
49
- # Addressable 2.2.0
235
+ ## Addressable 2.2.0 <a name="v2.2.0">
50
236
  - added site methods
51
237
  - improved documentation
52
238
 
53
- # Addressable 2.1.2
239
+ ## Addressable 2.1.2 <a name="v2.1.2">
54
240
  - added HTTP request URI methods
55
241
  - better handling of Windows file paths
56
242
  - validation_deferred boolean replaced with defer_validation block
@@ -58,14 +244,14 @@
58
244
  - fixed issue with constructing URIs with relative paths
59
245
  - fixed warnings
60
246
 
61
- # Addressable 2.1.1
247
+ ## Addressable 2.1.1 <a name="v2.1.1">
62
248
  - more type checking changes
63
249
  - fixed issue with unicode normalization
64
250
  - added method to find template defaults
65
251
  - symbolic keys are now allowed in template mappings
66
252
  - numeric values and symbolic values are now allowed in template mappings
67
253
 
68
- # Addressable 2.1.0
254
+ ## Addressable 2.1.0 <a name="v2.1.0x">
69
255
  - refactored URI template support out into its own class
70
256
  - removed extract method due to being useless and unreliable
71
257
  - removed Addressable::URI.expand_template
@@ -79,15 +265,15 @@
79
265
  - worked around issue with freezing URIs
80
266
  - improved specs
81
267
 
82
- # Addressable 2.0.2
268
+ ## Addressable 2.0.2 <a name="v2.0.2">
83
269
  - fixed issue with URI template expansion
84
270
  - fixed issue with percent escaping characters 0-15
85
271
 
86
- # Addressable 2.0.1
272
+ ## Addressable 2.0.1 <a name="v2.0.1">
87
273
  - fixed issue with query string assignment
88
274
  - fixed issue with improperly encoded components
89
275
 
90
- # Addressable 2.0.0
276
+ ## Addressable 2.0.0 <a name="v2.0.0">
91
277
  - the initialize method now takes an options hash as its only parameter
92
278
  - added query_values method to URI class
93
279
  - completely replaced IDNA implementation with pure Ruby
@@ -102,20 +288,20 @@
102
288
  - updated URI Template code to match v 03 of the draft spec
103
289
  - added a bunch of new specifications
104
290
 
105
- # Addressable 1.0.4
291
+ ## Addressable 1.0.4 <a name="v1.0.4">
106
292
  - switched to using RSpec's pending system for specs that rely on IDN
107
293
  - fixed issue with creating URIs with paths that are not prefixed with '/'
108
294
 
109
- # Addressable 1.0.3
295
+ ## Addressable 1.0.3 <a name="v1.0.3">
110
296
  - implemented a hash method
111
297
 
112
- # Addressable 1.0.2
298
+ ## Addressable 1.0.2 <a name="v1.0.2">
113
299
  - fixed minor bug with the extract_mapping method
114
300
 
115
- # Addressable 1.0.1
301
+ ## Addressable 1.0.1 <a name="v1.0.1">
116
302
  - fixed minor bug with the extract_mapping method
117
303
 
118
- # Addressable 1.0.0
304
+ ## Addressable 1.0.0 <a name="v1.0.0">
119
305
  - heuristic parse method added
120
306
  - parsing is slightly more strict
121
307
  - replaced to_h with to_hash
@@ -124,16 +310,16 @@
124
310
  - improved heckle rake task
125
311
  - no surviving heckle mutations
126
312
 
127
- # Addressable 0.1.2
313
+ ## Addressable 0.1.2 <a name="v0.1.2">
128
314
  - improved normalization
129
315
  - fixed bug in joining algorithm
130
316
  - updated specifications
131
-
132
- # Addressable 0.1.1
317
+
318
+ ## Addressable 0.1.1 <a name="v0.1.1">
133
319
  - updated documentation
134
320
  - added URI Template variable extraction
135
-
136
- # Addressable 0.1.0
321
+
322
+ ## Addressable 0.1.0 <a name="v0.1.0">
137
323
  - initial release
138
324
  - implementation based on RFC 3986, 3987
139
325
  - support for IRIs via libidn
data/README.md CHANGED
@@ -1,87 +1,121 @@
1
1
  # Addressable
2
2
 
3
3
  <dl>
4
- <dt>Homepage</dt><dd><a href="http://addressable.rubyforge.org/">addressable.rubyforge.org</a></dd>
4
+ <dt>Homepage</dt><dd><a href="https://github.com/sporkmonger/addressable">github.com/sporkmonger/addressable</a></dd>
5
5
  <dt>Author</dt><dd><a href="mailto:bob@sporkmonger.com">Bob Aman</a></dd>
6
- <dt>Copyright</dt><dd>Copyright © 2010 Bob Aman</dd>
6
+ <dt>Copyright</dt><dd>Copyright © Bob Aman</dd>
7
7
  <dt>License</dt><dd>Apache 2.0</dd>
8
8
  </dl>
9
9
 
10
- [![Build Status](https://secure.travis-ci.org/sporkmonger/addressable.png)](http://travis-ci.org/sporkmonger/addressable)
11
- [![Dependency Status](https://gemnasium.com/sporkmonger/addressable.png)](https://gemnasium.com/sporkmonger/addressable)
10
+ [![Gem Version](https://img.shields.io/gem/dt/addressable.svg)][gem]
11
+ [![Build Status](https://github.com/sporkmonger/addressable/workflows/CI/badge.svg)][actions]
12
+ [![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls]
13
+ [![Documentation Coverage Status](https://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch]
12
14
 
13
- # Description
15
+ [gem]: https://rubygems.org/gems/addressable
16
+ [actions]: https://github.com/sporkmonger/addressable/actions
17
+ [coveralls]: https://coveralls.io/r/sporkmonger/addressable
18
+ [inch]: https://inch-ci.org/github/sporkmonger/addressable
14
19
 
15
- Addressable is a replacement for the URI implementation that is part of
16
- Ruby's standard library. It more closely conforms to RFC 3986, RFC 3987, and
17
- RFC 6570 (level 4), providing support for IRIs and URI templates.
20
+ ## Description
18
21
 
19
- # Reference
22
+ Addressable is an alternative implementation to the URI implementation
23
+ that is part of Ruby's standard library. It is flexible, offers heuristic
24
+ parsing, and additionally provides extensive support for IRIs and URI templates.
25
+
26
+ Addressable closely conforms to RFC 3986, RFC 3987, and RFC 6570 (level 4).
27
+
28
+ ## Reference
20
29
 
21
30
  - {Addressable::URI}
22
31
  - {Addressable::Template}
23
- - {Addressable::UriTemplate}
24
-
25
- # Example usage
26
-
27
- require "addressable/uri"
28
-
29
- uri = Addressable::URI.parse("http://example.com/path/to/resource/")
30
- uri.scheme
31
- #=> "http"
32
- uri.host
33
- #=> "example.com"
34
- uri.path
35
- #=> "/path/to/resource/"
36
-
37
- uri = Addressable::URI.parse("http://www.詹姆斯.com/")
38
- uri.normalize
39
- #=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>
40
-
41
- require "addressable/template"
42
-
43
- template = Addressable::Template.new("http://example.com/{-list|+|query}/")
44
- template.expand({
45
- "query" => "an example query".split(" ")
46
- })
47
- #=> #<Addressable::URI:0xc9d95c URI:http://example.com/an+example+query/>
48
-
49
- template = Addressable::Template.new(
50
- "http://example.com/{-join|&|one,two,three}/"
51
- )
52
- template.partial_expand({"one" => "1", "three" => 3}).pattern
53
- #=> "http://example.com/?one=1{-prefix|&two=|two}&three=3"
54
-
55
- template = Addressable::Template.new(
56
- "http://{host}/{-suffix|/|segments}?{-join|&|one,two,bogus}\#{fragment}"
57
- )
58
- template2 = Addressable::UriTemplate.new(
59
- "http://{host}{/segments}/{?one,two,bogus}{#fragment}"
60
- )
61
- uri = Addressable::URI.parse(
62
- "http://example.com/a/b/c/?one=1&two=2#foo"
63
- )
64
- template.extract(uri)
65
- template2.extract(uri)
66
- #=>
67
- # {
68
- # "host" => "example.com",
69
- # "segments" => ["a", "b", "c"],
70
- # "one" => "1",
71
- # "two" => "2",
72
- # "fragment" => "foo"
73
- # }
74
-
75
- # Install
76
-
77
- $ sudo gem install addressable
32
+
33
+ ## Example usage
34
+
35
+ ```ruby
36
+ require "addressable/uri"
37
+
38
+ uri = Addressable::URI.parse("http://example.com/path/to/resource/")
39
+ uri.scheme
40
+ #=> "http"
41
+ uri.host
42
+ #=> "example.com"
43
+ uri.path
44
+ #=> "/path/to/resource/"
45
+
46
+ uri = Addressable::URI.parse("http://www.詹姆斯.com/")
47
+ uri.normalize
48
+ #=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>
49
+ ```
50
+
51
+
52
+ ## URI Templates
53
+
54
+ For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt).
55
+
56
+
57
+ ```ruby
58
+
59
+ require "addressable/template"
60
+
61
+ template = Addressable::Template.new("http://example.com/{?query*}")
62
+ template.expand({
63
+ "query" => {
64
+ 'foo' => 'bar',
65
+ 'color' => 'red'
66
+ }
67
+ })
68
+ #=> #<Addressable::URI:0xc9d95c URI:http://example.com/?foo=bar&color=red>
69
+
70
+ template = Addressable::Template.new("http://example.com/{?one,two,three}")
71
+ template.partial_expand({"one" => "1", "three" => 3}).pattern
72
+ #=> "http://example.com/?one=1{&two}&three=3"
73
+
74
+ template = Addressable::Template.new(
75
+ "http://{host}{/segments*}/{?one,two,bogus}{#fragment}"
76
+ )
77
+ uri = Addressable::URI.parse(
78
+ "http://example.com/a/b/c/?one=1&two=2#foo"
79
+ )
80
+ template.extract(uri)
81
+ #=>
82
+ # {
83
+ # "host" => "example.com",
84
+ # "segments" => ["a", "b", "c"],
85
+ # "one" => "1",
86
+ # "two" => "2",
87
+ # "fragment" => "foo"
88
+ # }
89
+ ```
90
+
91
+ ## Install
92
+
93
+ ```console
94
+ $ gem install addressable
95
+ ```
78
96
 
79
97
  You may optionally turn on native IDN support by installing libidn and the
80
98
  idn gem:
81
99
 
82
- $ sudo apt-get install idn # Debian/Ubuntu
83
- $ sudo brew install libidn # OS X
84
- $ sudo gem install idn
100
+ ```console
101
+ $ sudo apt-get install libidn11-dev # Debian/Ubuntu
102
+ $ brew install libidn # OS X
103
+ $ gem install idn-ruby
104
+ ```
105
+
106
+ ## Semantic Versioning
107
+
108
+ This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your
109
+ dependency using a pessimistic version constraint covering the major and minor
110
+ values:
111
+
112
+ ```ruby
113
+ spec.add_dependency 'addressable', '~> 2.7'
114
+ ```
115
+
116
+ If you need a specific bug fix, you can also specify minimum tiny versions
117
+ without preventing updates to the latest minor release:
85
118
 
86
- **NOTE:** Native IDN support appears to be broken in Ruby 1.9.x. The IDN gem
87
- hasn't been updated in years.
119
+ ```ruby
120
+ spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7'
121
+ ```
@@ -1,6 +1,7 @@
1
- # encoding:utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  #--
3
- # Copyright (C) 2006-2011 Bob Aman
4
+ # Copyright (C) Bob Aman
4
5
  #
5
6
  # Licensed under the Apache License, Version 2.0 (the "License");
6
7
  # you may not use this file except in compliance with the License.
@@ -21,23 +22,45 @@ require "idn"
21
22
  module Addressable
22
23
  module IDNA
23
24
  def self.punycode_encode(value)
24
- IDN::Punycode.encode(value)
25
+ IDN::Punycode.encode(value.to_s)
25
26
  end
26
27
 
27
28
  def self.punycode_decode(value)
28
- IDN::Punycode.decode(value)
29
+ IDN::Punycode.decode(value.to_s)
29
30
  end
30
31
 
31
- def self.unicode_normalize_kc(value)
32
- IDN::Stringprep.nfkc_normalize(value)
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
33
40
  end
34
41
 
35
42
  def self.to_ascii(value)
36
- IDN::Idna.toASCII(value)
43
+ value.to_s.split('.', -1).map do |segment|
44
+ if segment.size > 0 && segment.size < 64
45
+ IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED)
46
+ elsif segment.size >= 64
47
+ segment
48
+ else
49
+ ''
50
+ end
51
+ end.join('.')
37
52
  end
38
53
 
39
54
  def self.to_unicode(value)
40
- IDN::Idna.toUnicode(value)
55
+ value.to_s.split('.', -1).map do |segment|
56
+ if segment.size > 0 && segment.size < 64
57
+ IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED)
58
+ elsif segment.size >= 64
59
+ segment
60
+ else
61
+ ''
62
+ end
63
+ end.join('.')
41
64
  end
42
65
  end
43
66
  end