addressable 2.6.0 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of addressable might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -2
- data/README.md +5 -3
- data/Rakefile +3 -3
- data/lib/addressable/idna/pure.rb +18 -18
- data/lib/addressable/uri.rb +38 -19
- data/lib/addressable/version.rb +1 -1
- data/spec/addressable/uri_spec.rb +64 -6
- data/tasks/gem.rake +6 -6
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73a7a5a0dfea976017780e3b434e97aa58216019
|
4
|
+
data.tar.gz: a708925a0882de04f840e9e54d279eb954775921
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c311a5594d7f1051df67287badef72551c52c6bc47598017099d5e8b5c2a9638144bcc6d635b418dfc1970e185cf31016ad54f681c7156d440223ef62f060bc5
|
7
|
+
data.tar.gz: 78527879654347fcf16be86684e1b37ca240c5a80d3baf2217cfdfb501cd6255de47a7cc8058c10e98e558b073981a27be06672f4dec8cf7d18e88a34609e6a1
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# Addressable 2.7.0
|
2
|
+
- added `:compacted` flag to `normalized_query`
|
3
|
+
- `heuristic_parse` handles `mailto:` more intuitively
|
4
|
+
- refactored validation to use a prepended module
|
5
|
+
- dropped explicit support for JRuby 9.0.5.0
|
6
|
+
- compatibility w/ public_suffix 4.x
|
7
|
+
- performance improvements
|
8
|
+
|
1
9
|
# Addressable 2.6.0
|
2
10
|
- added `tld=` method to allow assignment to the public suffix
|
3
11
|
- most `heuristic_parse` patterns are now case-insensitive
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -19,9 +19,11 @@
|
|
19
19
|
|
20
20
|
# Description
|
21
21
|
|
22
|
-
Addressable is
|
23
|
-
Ruby's standard library. It
|
24
|
-
|
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).
|
25
27
|
|
26
28
|
# Reference
|
27
29
|
|
data/Rakefile
CHANGED
@@ -14,9 +14,9 @@ RELEASE_NAME = "REL #{PKG_VERSION}"
|
|
14
14
|
|
15
15
|
PKG_SUMMARY = "URI Implementation"
|
16
16
|
PKG_DESCRIPTION = <<-TEXT
|
17
|
-
Addressable is
|
18
|
-
Ruby's standard library. It
|
19
|
-
|
17
|
+
Addressable is an alternative implementation to the URI implementation that is
|
18
|
+
part of Ruby's standard library. It is flexible, offers heuristic parsing, and
|
19
|
+
additionally provides extensive support for IRIs and URI templates.
|
20
20
|
TEXT
|
21
21
|
|
22
22
|
PKG_FILES = FileList[
|
@@ -135,7 +135,7 @@ module Addressable
|
|
135
135
|
unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) }
|
136
136
|
return unpacked.pack("U*")
|
137
137
|
end
|
138
|
-
|
138
|
+
private_class_method :unicode_downcase
|
139
139
|
|
140
140
|
def self.unicode_compose(unpacked)
|
141
141
|
unpacked_result = []
|
@@ -160,7 +160,7 @@ module Addressable
|
|
160
160
|
unpacked_result << starter
|
161
161
|
return unpacked_result
|
162
162
|
end
|
163
|
-
|
163
|
+
private_class_method :unicode_compose
|
164
164
|
|
165
165
|
def self.unicode_compose_pair(ch_one, ch_two)
|
166
166
|
if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT &&
|
@@ -214,7 +214,7 @@ module Addressable
|
|
214
214
|
|
215
215
|
return lookup_unicode_composition(p)
|
216
216
|
end
|
217
|
-
|
217
|
+
private_class_method :unicode_compose_pair
|
218
218
|
|
219
219
|
def self.unicode_sort_canonical(unpacked)
|
220
220
|
unpacked = unpacked.dup
|
@@ -238,7 +238,7 @@ module Addressable
|
|
238
238
|
end
|
239
239
|
return unpacked
|
240
240
|
end
|
241
|
-
|
241
|
+
private_class_method :unicode_sort_canonical
|
242
242
|
|
243
243
|
def self.unicode_decompose(unpacked)
|
244
244
|
unpacked_result = []
|
@@ -259,7 +259,7 @@ module Addressable
|
|
259
259
|
end
|
260
260
|
return unpacked_result
|
261
261
|
end
|
262
|
-
|
262
|
+
private_class_method :unicode_decompose
|
263
263
|
|
264
264
|
def self.unicode_decompose_hangul(codepoint)
|
265
265
|
sindex = codepoint - HANGUL_SBASE;
|
@@ -276,7 +276,7 @@ module Addressable
|
|
276
276
|
end
|
277
277
|
return l, v, t
|
278
278
|
end
|
279
|
-
|
279
|
+
private_class_method :unicode_decompose_hangul
|
280
280
|
|
281
281
|
def self.lookup_unicode_combining_class(codepoint)
|
282
282
|
codepoint_data = UNICODE_DATA[codepoint]
|
@@ -284,14 +284,14 @@ module Addressable
|
|
284
284
|
(codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) :
|
285
285
|
0)
|
286
286
|
end
|
287
|
-
|
287
|
+
private_class_method :lookup_unicode_combining_class
|
288
288
|
|
289
289
|
def self.lookup_unicode_compatibility(codepoint)
|
290
290
|
codepoint_data = UNICODE_DATA[codepoint]
|
291
291
|
(codepoint_data ?
|
292
292
|
codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil)
|
293
293
|
end
|
294
|
-
|
294
|
+
private_class_method :lookup_unicode_compatibility
|
295
295
|
|
296
296
|
def self.lookup_unicode_lowercase(codepoint)
|
297
297
|
codepoint_data = UNICODE_DATA[codepoint]
|
@@ -299,12 +299,12 @@ module Addressable
|
|
299
299
|
(codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) :
|
300
300
|
codepoint)
|
301
301
|
end
|
302
|
-
|
302
|
+
private_class_method :lookup_unicode_lowercase
|
303
303
|
|
304
304
|
def self.lookup_unicode_composition(unpacked)
|
305
305
|
return COMPOSITION_TABLE[unpacked]
|
306
306
|
end
|
307
|
-
|
307
|
+
private_class_method :lookup_unicode_composition
|
308
308
|
|
309
309
|
HANGUL_SBASE = 0xac00
|
310
310
|
HANGUL_LBASE = 0x1100
|
@@ -341,7 +341,7 @@ module Addressable
|
|
341
341
|
end
|
342
342
|
|
343
343
|
COMPOSITION_TABLE = {}
|
344
|
-
|
344
|
+
UNICODE_DATA.each do |codepoint, data|
|
345
345
|
canonical = data[UNICODE_DATA_CANONICAL]
|
346
346
|
exclusion = data[UNICODE_DATA_EXCLUSION]
|
347
347
|
|
@@ -500,7 +500,7 @@ module Addressable
|
|
500
500
|
|
501
501
|
output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "")
|
502
502
|
end
|
503
|
-
|
503
|
+
private_class_method :punycode_encode
|
504
504
|
|
505
505
|
def self.punycode_decode(punycode)
|
506
506
|
input = []
|
@@ -622,22 +622,22 @@ module Addressable
|
|
622
622
|
|
623
623
|
output.pack("U*")
|
624
624
|
end
|
625
|
-
|
625
|
+
private_class_method :punycode_decode
|
626
626
|
|
627
627
|
def self.punycode_basic?(codepoint)
|
628
628
|
codepoint < 0x80
|
629
629
|
end
|
630
|
-
|
630
|
+
private_class_method :punycode_basic?
|
631
631
|
|
632
632
|
def self.punycode_delimiter?(codepoint)
|
633
633
|
codepoint == PUNYCODE_DELIMITER
|
634
634
|
end
|
635
|
-
|
635
|
+
private_class_method :punycode_delimiter?
|
636
636
|
|
637
637
|
def self.punycode_encode_digit(d)
|
638
638
|
d + 22 + 75 * ((d < 26) ? 1 : 0)
|
639
639
|
end
|
640
|
-
|
640
|
+
private_class_method :punycode_encode_digit
|
641
641
|
|
642
642
|
# Returns the numeric value of a basic codepoint
|
643
643
|
# (for use in representing integers) in the range 0 to
|
@@ -653,7 +653,7 @@ module Addressable
|
|
653
653
|
PUNYCODE_BASE
|
654
654
|
end
|
655
655
|
end
|
656
|
-
|
656
|
+
private_class_method :punycode_decode_digit
|
657
657
|
|
658
658
|
# Bias adaptation method
|
659
659
|
def self.punycode_adapt(delta, numpoints, firsttime)
|
@@ -670,7 +670,7 @@ module Addressable
|
|
670
670
|
|
671
671
|
k + (difference + 1) * delta / (delta + PUNYCODE_SKEW)
|
672
672
|
end
|
673
|
-
|
673
|
+
private_class_method :punycode_adapt
|
674
674
|
end
|
675
675
|
# :startdoc:
|
676
676
|
end
|
data/lib/addressable/uri.rb
CHANGED
@@ -207,7 +207,7 @@ module Addressable
|
|
207
207
|
fragments = match.captures
|
208
208
|
authority = fragments[3]
|
209
209
|
if authority && authority.length > 0
|
210
|
-
new_authority = authority.
|
210
|
+
new_authority = authority.tr("\\", "/").gsub(" ", "%20")
|
211
211
|
# NOTE: We want offset 4, not 3!
|
212
212
|
offset = match.offset(4)
|
213
213
|
uri = uri.dup
|
@@ -218,8 +218,9 @@ module Addressable
|
|
218
218
|
parsed = self.parse(hints[:scheme] + "://" + uri)
|
219
219
|
end
|
220
220
|
if parsed.path.include?(".")
|
221
|
-
|
222
|
-
|
221
|
+
if parsed.path[/\b@\b/]
|
222
|
+
parsed.scheme = "mailto" unless parsed.scheme
|
223
|
+
elsif new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1]
|
223
224
|
parsed.defer_validation do
|
224
225
|
new_path = parsed.path.sub(
|
225
226
|
Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR)
|
@@ -281,15 +282,15 @@ module Addressable
|
|
281
282
|
uri.path.sub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do
|
282
283
|
"/#{$1.downcase}:/"
|
283
284
|
end
|
284
|
-
uri.path.
|
285
|
+
uri.path.tr!("\\", SLASH)
|
285
286
|
if File.exist?(uri.path) &&
|
286
287
|
File.stat(uri.path).directory?
|
287
|
-
uri.path.
|
288
|
+
uri.path.chomp!(SLASH)
|
288
289
|
uri.path = uri.path + '/'
|
289
290
|
end
|
290
291
|
|
291
292
|
# If the path is absolute, set the scheme and host.
|
292
|
-
if uri.path
|
293
|
+
if uri.path.start_with?(SLASH)
|
293
294
|
uri.scheme = "file"
|
294
295
|
uri.host = EMPTY_STR
|
295
296
|
end
|
@@ -326,6 +327,21 @@ module Addressable
|
|
326
327
|
return result
|
327
328
|
end
|
328
329
|
|
330
|
+
##
|
331
|
+
# Tables used to optimize encoding operations in `self.encode_component`
|
332
|
+
# and `self.normalize_component`
|
333
|
+
SEQUENCE_ENCODING_TABLE = Hash.new do |hash, sequence|
|
334
|
+
hash[sequence] = sequence.unpack("C*").map do |c|
|
335
|
+
format("%02x", c)
|
336
|
+
end.join
|
337
|
+
end
|
338
|
+
|
339
|
+
SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE = Hash.new do |hash, sequence|
|
340
|
+
hash[sequence] = sequence.unpack("C*").map do |c|
|
341
|
+
format("%%%02X", c)
|
342
|
+
end.join
|
343
|
+
end
|
344
|
+
|
329
345
|
##
|
330
346
|
# Percent encodes a URI component.
|
331
347
|
#
|
@@ -392,12 +408,14 @@ module Addressable
|
|
392
408
|
component.force_encoding(Encoding::ASCII_8BIT)
|
393
409
|
# Avoiding gsub! because there are edge cases with frozen strings
|
394
410
|
component = component.gsub(character_class) do |sequence|
|
395
|
-
|
411
|
+
SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE[sequence]
|
396
412
|
end
|
397
413
|
if upcase_encoded.length > 0
|
398
|
-
|
399
|
-
char
|
400
|
-
end
|
414
|
+
upcase_encoded_chars = upcase_encoded.chars.map do |char|
|
415
|
+
SEQUENCE_ENCODING_TABLE[char]
|
416
|
+
end
|
417
|
+
component = component.gsub(/%(#{upcase_encoded_chars.join('|')})/,
|
418
|
+
&:upcase)
|
401
419
|
end
|
402
420
|
return component
|
403
421
|
end
|
@@ -531,7 +549,7 @@ module Addressable
|
|
531
549
|
character_class = "#{character_class}%" unless character_class.include?('%')
|
532
550
|
|
533
551
|
"|%(?!#{leave_encoded.chars.map do |char|
|
534
|
-
seq = char
|
552
|
+
seq = SEQUENCE_ENCODING_TABLE[char]
|
535
553
|
[seq.upcase, seq.downcase]
|
536
554
|
end.flatten.join('|')})"
|
537
555
|
end
|
@@ -1172,7 +1190,7 @@ module Addressable
|
|
1172
1190
|
# Returns the top-level domain for this host.
|
1173
1191
|
#
|
1174
1192
|
# @example
|
1175
|
-
# Addressable::URI.parse("www.example.co.uk").tld # => "co.uk"
|
1193
|
+
# Addressable::URI.parse("http://www.example.co.uk").tld # => "co.uk"
|
1176
1194
|
def tld
|
1177
1195
|
PublicSuffix.parse(self.host, ignore_private: true).tld
|
1178
1196
|
end
|
@@ -1182,7 +1200,7 @@ module Addressable
|
|
1182
1200
|
#
|
1183
1201
|
# @param [String, #to_str] new_tld The new top-level domain.
|
1184
1202
|
def tld=(new_tld)
|
1185
|
-
replaced_tld =
|
1203
|
+
replaced_tld = host.sub(/#{tld}\z/, new_tld)
|
1186
1204
|
self.host = PublicSuffix::Domain.new(replaced_tld).to_s
|
1187
1205
|
end
|
1188
1206
|
|
@@ -1190,7 +1208,7 @@ module Addressable
|
|
1190
1208
|
# Returns the public suffix domain for this host.
|
1191
1209
|
#
|
1192
1210
|
# @example
|
1193
|
-
# Addressable::URI.parse("www.example.co.uk").domain # => "example.co.uk"
|
1211
|
+
# Addressable::URI.parse("http://www.example.co.uk").domain # => "example.co.uk"
|
1194
1212
|
def domain
|
1195
1213
|
PublicSuffix.domain(self.host, ignore_private: true)
|
1196
1214
|
end
|
@@ -1595,6 +1613,7 @@ module Addressable
|
|
1595
1613
|
# Make sure possible key-value pair delimiters are escaped.
|
1596
1614
|
modified_query_class.sub!("\\&", "").sub!("\\;", "")
|
1597
1615
|
pairs = (self.query || "").split("&", -1)
|
1616
|
+
pairs.delete_if(&:empty?) if flags.include?(:compacted)
|
1598
1617
|
pairs.sort! if flags.include?(:sorted)
|
1599
1618
|
component = pairs.map do |pair|
|
1600
1619
|
Addressable::URI.normalize_component(pair, modified_query_class, "+")
|
@@ -1660,7 +1679,7 @@ module Addressable
|
|
1660
1679
|
# Treating '+' as a space was just an unbelievably bad idea.
|
1661
1680
|
# There was nothing wrong with '%20'!
|
1662
1681
|
# If it ain't broke, don't fix it!
|
1663
|
-
pair[1] = URI.unencode_component(pair[1].to_str.
|
1682
|
+
pair[1] = URI.unencode_component(pair[1].to_str.tr("+", " "))
|
1664
1683
|
end
|
1665
1684
|
if return_type == Hash
|
1666
1685
|
accu[pair[0]] = pair[1]
|
@@ -1917,7 +1936,7 @@ module Addressable
|
|
1917
1936
|
# Section 5.2.3 of RFC 3986
|
1918
1937
|
#
|
1919
1938
|
# Removes the right-most path segment from the base path.
|
1920
|
-
if base_path
|
1939
|
+
if base_path.include?(SLASH)
|
1921
1940
|
base_path.sub!(/\/[^\/]+$/, SLASH)
|
1922
1941
|
else
|
1923
1942
|
base_path = EMPTY_STR
|
@@ -2367,10 +2386,10 @@ module Addressable
|
|
2367
2386
|
#
|
2368
2387
|
# @param [Proc] block
|
2369
2388
|
# A set of operations to perform on a given URI.
|
2370
|
-
def defer_validation
|
2371
|
-
raise LocalJumpError, "No block given." unless
|
2389
|
+
def defer_validation
|
2390
|
+
raise LocalJumpError, "No block given." unless block_given?
|
2372
2391
|
@validation_deferred = true
|
2373
|
-
|
2392
|
+
yield
|
2374
2393
|
@validation_deferred = false
|
2375
2394
|
validate
|
2376
2395
|
return nil
|
data/lib/addressable/version.rb
CHANGED
@@ -3944,7 +3944,7 @@ describe Addressable::URI, "when parsed from " +
|
|
3944
3944
|
it "should raise an error if assigning a bogus object to the hostname" do
|
3945
3945
|
expect(lambda do
|
3946
3946
|
@uri.hostname = Object.new
|
3947
|
-
end).to raise_error
|
3947
|
+
end).to raise_error(TypeError)
|
3948
3948
|
end
|
3949
3949
|
|
3950
3950
|
it "should have the correct port after assignment" do
|
@@ -4303,6 +4303,26 @@ describe Addressable::URI, "when parsed from " +
|
|
4303
4303
|
end
|
4304
4304
|
end
|
4305
4305
|
|
4306
|
+
describe Addressable::URI, "when parsed from 'http://example/?b=1&a=2&c=3'" do
|
4307
|
+
before do
|
4308
|
+
@uri = Addressable::URI.parse("http://example/?b=1&a=2&c=3")
|
4309
|
+
end
|
4310
|
+
|
4311
|
+
it "should have a sorted normalized query of 'a=2&b=1&c=3'" do
|
4312
|
+
expect(@uri.normalized_query(:sorted)).to eq("a=2&b=1&c=3")
|
4313
|
+
end
|
4314
|
+
end
|
4315
|
+
|
4316
|
+
describe Addressable::URI, "when parsed from 'http://example/?&a&&c&'" do
|
4317
|
+
before do
|
4318
|
+
@uri = Addressable::URI.parse("http://example/?&a&&c&")
|
4319
|
+
end
|
4320
|
+
|
4321
|
+
it "should have a compacted normalized query of 'a&c'" do
|
4322
|
+
expect(@uri.normalized_query(:compacted)).to eq("a&c")
|
4323
|
+
end
|
4324
|
+
end
|
4325
|
+
|
4306
4326
|
describe Addressable::URI, "when parsed from " +
|
4307
4327
|
"'http://example.com/sound%2bvision'" do
|
4308
4328
|
before do
|
@@ -4417,7 +4437,7 @@ describe Addressable::URI, "when parsed from " +
|
|
4417
4437
|
expect(lambda do
|
4418
4438
|
# This would create an invalid URI
|
4419
4439
|
@uri.authority = nil
|
4420
|
-
end).to raise_error
|
4440
|
+
end).to raise_error(Addressable::URI::InvalidURIError)
|
4421
4441
|
end
|
4422
4442
|
end
|
4423
4443
|
|
@@ -4820,7 +4840,7 @@ describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do
|
|
4820
4840
|
|
4821
4841
|
it "should raise an error for invalid return type values" do
|
4822
4842
|
expect(lambda do
|
4823
|
-
@uri.query_values(
|
4843
|
+
@uri.query_values(Integer)
|
4824
4844
|
end).to raise_error(ArgumentError)
|
4825
4845
|
end
|
4826
4846
|
|
@@ -5515,18 +5535,18 @@ describe Addressable::URI, "when given the tld " do
|
|
5515
5535
|
end
|
5516
5536
|
|
5517
5537
|
context "which " do
|
5518
|
-
let (:uri) { Addressable::URI.parse("http://comrade.net/path/to/source/") }
|
5538
|
+
let (:uri) { Addressable::URI.parse("http://www.comrade.net/path/to/source/") }
|
5519
5539
|
|
5520
5540
|
it "contains a subdomain" do
|
5521
5541
|
uri.tld = "co.uk"
|
5522
5542
|
|
5523
|
-
expect(uri.to_s).to eq("http://comrade.co.uk/path/to/source/")
|
5543
|
+
expect(uri.to_s).to eq("http://www.comrade.co.uk/path/to/source/")
|
5524
5544
|
end
|
5525
5545
|
|
5526
5546
|
it "is part of the domain" do
|
5527
5547
|
uri.tld = "com"
|
5528
5548
|
|
5529
|
-
expect(uri.to_s).to eq("http://comrade.com/path/to/source/")
|
5549
|
+
expect(uri.to_s).to eq("http://www.comrade.com/path/to/source/")
|
5530
5550
|
end
|
5531
5551
|
end
|
5532
5552
|
end
|
@@ -6352,6 +6372,44 @@ describe Addressable::URI, "when given the input " +
|
|
6352
6372
|
end
|
6353
6373
|
end
|
6354
6374
|
|
6375
|
+
describe Addressable::URI, "when given the input: 'user@domain.com'" do
|
6376
|
+
before do
|
6377
|
+
@input = "user@domain.com"
|
6378
|
+
end
|
6379
|
+
|
6380
|
+
context "for heuristic parse" do
|
6381
|
+
it "should remain 'mailto:user@domain.com'" do
|
6382
|
+
uri = Addressable::URI.heuristic_parse("mailto:#{@input}")
|
6383
|
+
expect(uri.to_s).to eq("mailto:user@domain.com")
|
6384
|
+
end
|
6385
|
+
|
6386
|
+
it "should have a scheme of 'mailto'" do
|
6387
|
+
uri = Addressable::URI.heuristic_parse(@input)
|
6388
|
+
expect(uri.to_s).to eq("mailto:user@domain.com")
|
6389
|
+
expect(uri.scheme).to eq("mailto")
|
6390
|
+
end
|
6391
|
+
|
6392
|
+
it "should remain 'acct:user@domain.com'" do
|
6393
|
+
uri = Addressable::URI.heuristic_parse("acct:#{@input}")
|
6394
|
+
expect(uri.to_s).to eq("acct:user@domain.com")
|
6395
|
+
end
|
6396
|
+
|
6397
|
+
context "HTTP" do
|
6398
|
+
before do
|
6399
|
+
@uri = Addressable::URI.heuristic_parse("http://#{@input}/")
|
6400
|
+
end
|
6401
|
+
|
6402
|
+
it "should remain 'http://user@domain.com/'" do
|
6403
|
+
expect(@uri.to_s).to eq("http://user@domain.com/")
|
6404
|
+
end
|
6405
|
+
|
6406
|
+
it "should have the username 'user' for HTTP basic authentication" do
|
6407
|
+
expect(@uri.user).to eq("user")
|
6408
|
+
end
|
6409
|
+
end
|
6410
|
+
end
|
6411
|
+
end
|
6412
|
+
|
6355
6413
|
describe Addressable::URI, "when assigning query values" do
|
6356
6414
|
before do
|
6357
6415
|
@uri = Addressable::URI.new
|
data/tasks/gem.rake
CHANGED
@@ -20,10 +20,10 @@ namespace :gem do
|
|
20
20
|
exit(1)
|
21
21
|
end
|
22
22
|
|
23
|
-
s.required_ruby_version =
|
23
|
+
s.required_ruby_version = ">= 2.0"
|
24
24
|
|
25
|
-
s.add_runtime_dependency
|
26
|
-
s.add_development_dependency
|
25
|
+
s.add_runtime_dependency "public_suffix", ">= 2.0.2", "< 5.0"
|
26
|
+
s.add_development_dependency "bundler", ">= 1.0", "< 3.0"
|
27
27
|
|
28
28
|
s.require_path = "lib"
|
29
29
|
|
@@ -42,7 +42,7 @@ namespace :gem do
|
|
42
42
|
desc "Generates .gemspec file"
|
43
43
|
task :gemspec do
|
44
44
|
spec_string = GEM_SPEC.to_ruby
|
45
|
-
File.open("#{GEM_SPEC.name}.gemspec",
|
45
|
+
File.open("#{GEM_SPEC.name}.gemspec", "w") do |file|
|
46
46
|
file.write spec_string
|
47
47
|
end
|
48
48
|
end
|
@@ -72,9 +72,9 @@ namespace :gem do
|
|
72
72
|
desc "Reinstall the gem"
|
73
73
|
task :reinstall => [:uninstall, :install]
|
74
74
|
|
75
|
-
desc
|
75
|
+
desc "Package for release"
|
76
76
|
task :release => ["gem:package", "gem:gemspec"] do |t|
|
77
|
-
v = ENV[
|
77
|
+
v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
|
78
78
|
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION
|
79
79
|
pkg = "pkg/#{GEM_SPEC.full_name}"
|
80
80
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: addressable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Aman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: public_suffix
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: 2.0.2
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '5.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: 2.0.2
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '5.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -51,9 +51,9 @@ dependencies:
|
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '3.0'
|
53
53
|
description: |
|
54
|
-
Addressable is
|
55
|
-
Ruby's standard library. It
|
56
|
-
|
54
|
+
Addressable is an alternative implementation to the URI implementation that is
|
55
|
+
part of Ruby's standard library. It is flexible, offers heuristic parsing, and
|
56
|
+
additionally provides extensive support for IRIs and URI templates.
|
57
57
|
email: bob@sporkmonger.com
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
@@ -108,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
108
|
version: '0'
|
109
109
|
requirements: []
|
110
110
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.5.
|
111
|
+
rubygems_version: 2.5.2.3
|
112
112
|
signing_key:
|
113
113
|
specification_version: 4
|
114
114
|
summary: URI Implementation
|