addressable 2.8.1 → 2.8.5

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.
@@ -53,7 +53,7 @@ module Addressable
53
53
  PCHAR = (UNRESERVED + SUB_DELIMS + "\\:\\@").freeze
54
54
  SCHEME = (ALPHA + DIGIT + "\\-\\+\\.").freeze
55
55
  HOST = (UNRESERVED + SUB_DELIMS + "\\[\\:\\]").freeze
56
- AUTHORITY = (PCHAR + "\\[\\:\\]").freeze
56
+ AUTHORITY = (PCHAR + "\\[\\]").freeze
57
57
  PATH = (PCHAR + "\\/").freeze
58
58
  QUERY = (PCHAR + "\\/\\?").freeze
59
59
  FRAGMENT = (PCHAR + "\\/\\?").freeze
@@ -117,7 +117,7 @@ module Addressable
117
117
  uri = uri.to_str
118
118
  rescue TypeError, NoMethodError
119
119
  raise TypeError, "Can't convert #{uri.class} into String."
120
- end if not uri.is_a? String
120
+ end unless uri.is_a?(String)
121
121
 
122
122
  # This Regexp supplied as an example in RFC 3986, and it works great.
123
123
  scan = uri.scan(URIREGEX)
@@ -138,15 +138,15 @@ module Addressable
138
138
  user = userinfo.strip[/^([^:]*):?/, 1]
139
139
  password = userinfo.strip[/:(.*)$/, 1]
140
140
  end
141
+
141
142
  host = authority.sub(
142
143
  /^([^\[\]]*)@/, EMPTY_STR
143
144
  ).sub(
144
145
  /:([^:@\[\]]*?)$/, EMPTY_STR
145
146
  )
147
+
146
148
  port = authority[/:([^:@\[\]]*?)$/, 1]
147
- end
148
- if port == EMPTY_STR
149
- port = nil
149
+ port = nil if port == EMPTY_STR
150
150
  end
151
151
 
152
152
  return new(
@@ -189,7 +189,7 @@ module Addressable
189
189
  uri = uri.to_s
190
190
  end
191
191
 
192
- if !uri.respond_to?(:to_str)
192
+ unless uri.respond_to?(:to_str)
193
193
  raise TypeError, "Can't convert #{uri.class} into String."
194
194
  end
195
195
  # Otherwise, convert to a String
@@ -281,7 +281,7 @@ module Addressable
281
281
  return nil unless path
282
282
  # If a URI object is passed, just return itself.
283
283
  return path if path.kind_of?(self)
284
- if !path.respond_to?(:to_str)
284
+ unless path.respond_to?(:to_str)
285
285
  raise TypeError, "Can't convert #{path.class} into String."
286
286
  end
287
287
  # Otherwise, convert to a String
@@ -329,13 +329,13 @@ module Addressable
329
329
  # #=> #<Addressable::URI:0xcab390 URI:http://example.com/relative/path>
330
330
  def self.join(*uris)
331
331
  uri_objects = uris.collect do |uri|
332
- if !uri.respond_to?(:to_str)
332
+ unless uri.respond_to?(:to_str)
333
333
  raise TypeError, "Can't convert #{uri.class} into String."
334
334
  end
335
335
  uri.kind_of?(self) ? uri : self.parse(uri.to_str)
336
336
  end
337
337
  result = uri_objects.shift.dup
338
- for uri in uri_objects
338
+ uri_objects.each do |uri|
339
339
  result.join!(uri)
340
340
  end
341
341
  return result
@@ -344,17 +344,13 @@ module Addressable
344
344
  ##
345
345
  # Tables used to optimize encoding operations in `self.encode_component`
346
346
  # and `self.normalize_component`
347
- SEQUENCE_ENCODING_TABLE = Hash.new do |hash, sequence|
348
- hash[sequence] = sequence.unpack("C*").map do |c|
349
- format("%02x", c)
350
- end.join
351
- end
347
+ SEQUENCE_ENCODING_TABLE = (0..255).map do |byte|
348
+ format("%02x", byte).freeze
349
+ end.freeze
352
350
 
353
- SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE = Hash.new do |hash, sequence|
354
- hash[sequence] = sequence.unpack("C*").map do |c|
355
- format("%%%02X", c)
356
- end.join
357
- end
351
+ SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE = (0..255).map do |byte|
352
+ format("%%%02X", byte).freeze
353
+ end.freeze
358
354
 
359
355
  ##
360
356
  # Percent encodes a URI component.
@@ -421,16 +417,17 @@ module Addressable
421
417
  component = component.dup
422
418
  component.force_encoding(Encoding::ASCII_8BIT)
423
419
  # Avoiding gsub! because there are edge cases with frozen strings
424
- component = component.gsub(character_class) do |sequence|
425
- SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE[sequence]
420
+ component = component.gsub(character_class) do |char|
421
+ SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE[char.ord]
426
422
  end
427
423
  if upcase_encoded.length > 0
428
- upcase_encoded_chars = upcase_encoded.chars.map do |char|
429
- SEQUENCE_ENCODING_TABLE[char]
424
+ upcase_encoded_chars = upcase_encoded.bytes.map do |byte|
425
+ SEQUENCE_ENCODING_TABLE[byte]
430
426
  end
431
427
  component = component.gsub(/%(#{upcase_encoded_chars.join('|')})/,
432
428
  &:upcase)
433
429
  end
430
+
434
431
  return component
435
432
  end
436
433
 
@@ -481,7 +478,7 @@ module Addressable
481
478
  leave_encoded.include?(c) ? sequence : c
482
479
  end
483
480
 
484
- result.force_encoding("utf-8")
481
+ result.force_encoding(Encoding::UTF_8)
485
482
  if return_type == String
486
483
  return result
487
484
  elsif return_type == ::Addressable::URI
@@ -560,10 +557,9 @@ module Addressable
560
557
  leave_re = if leave_encoded.length > 0
561
558
  character_class = "#{character_class}%" unless character_class.include?('%')
562
559
 
563
- "|%(?!#{leave_encoded.chars.flat_map do |char|
564
- seq = SEQUENCE_ENCODING_TABLE[char]
565
- [seq.upcase, seq.downcase]
566
- end.join('|')})"
560
+ bytes = leave_encoded.bytes
561
+ leave_encoded_pattern = bytes.map { |b| SEQUENCE_ENCODING_TABLE[b] }.join('|')
562
+ "|%(?!#{leave_encoded_pattern}|#{leave_encoded_pattern.upcase})"
567
563
  end
568
564
 
569
565
  character_class = if leave_re
@@ -579,7 +575,7 @@ module Addressable
579
575
  unencoded = self.unencode_component(component, String, leave_encoded)
580
576
  begin
581
577
  encoded = self.encode_component(
582
- Addressable::IDNA.unicode_normalize_kc(unencoded),
578
+ unencoded.unicode_normalize(:nfc),
583
579
  character_class,
584
580
  leave_encoded
585
581
  )
@@ -687,8 +683,7 @@ module Addressable
687
683
  components.each do |key, value|
688
684
  if value != nil
689
685
  begin
690
- components[key] =
691
- Addressable::IDNA.unicode_normalize_kc(value.to_str)
686
+ components[key] = value.to_str.unicode_normalize(:nfc)
692
687
  rescue ArgumentError
693
688
  # Likely a malformed UTF-8 character, skip unicode normalization
694
689
  components[key] = value.to_str
@@ -836,7 +831,9 @@ module Addressable
836
831
  end
837
832
  end
838
833
 
839
- self.defer_validation do
834
+ reset_ivs
835
+
836
+ defer_validation do
840
837
  # Bunch of crazy logic required because of the composite components
841
838
  # like userinfo and authority.
842
839
  self.scheme = options[:scheme] if options[:scheme]
@@ -851,7 +848,8 @@ module Addressable
851
848
  self.query_values = options[:query_values] if options[:query_values]
852
849
  self.fragment = options[:fragment] if options[:fragment]
853
850
  end
854
- self.to_s
851
+
852
+ to_s # force path validation
855
853
  end
856
854
 
857
855
  ##
@@ -878,9 +876,7 @@ module Addressable
878
876
  # The scheme component for this URI.
879
877
  #
880
878
  # @return [String] The scheme component.
881
- def scheme
882
- return defined?(@scheme) ? @scheme : nil
883
- end
879
+ attr_reader :scheme
884
880
 
885
881
  ##
886
882
  # The scheme component for this URI, normalized.
@@ -888,8 +884,8 @@ module Addressable
888
884
  # @return [String] The scheme component, normalized.
889
885
  def normalized_scheme
890
886
  return nil unless self.scheme
891
- @normalized_scheme ||= begin
892
- if self.scheme =~ /^\s*ssh\+svn\s*$/i
887
+ if @normalized_scheme == NONE
888
+ @normalized_scheme = if self.scheme =~ /^\s*ssh\+svn\s*$/i
893
889
  "svn+ssh".dup
894
890
  else
895
891
  Addressable::URI.normalize_component(
@@ -920,7 +916,7 @@ module Addressable
920
916
  @scheme = nil if @scheme.to_s.strip.empty?
921
917
 
922
918
  # Reset dependent values
923
- remove_instance_variable(:@normalized_scheme) if defined?(@normalized_scheme)
919
+ @normalized_scheme = NONE
924
920
  remove_composite_values
925
921
 
926
922
  # Ensure we haven't created an invalid URI
@@ -931,9 +927,7 @@ module Addressable
931
927
  # The user component for this URI.
932
928
  #
933
929
  # @return [String] The user component.
934
- def user
935
- return defined?(@user) ? @user : nil
936
- end
930
+ attr_reader :user
937
931
 
938
932
  ##
939
933
  # The user component for this URI, normalized.
@@ -941,8 +935,8 @@ module Addressable
941
935
  # @return [String] The user component, normalized.
942
936
  def normalized_user
943
937
  return nil unless self.user
944
- return @normalized_user if defined?(@normalized_user)
945
- @normalized_user ||= begin
938
+ return @normalized_user unless @normalized_user == NONE
939
+ @normalized_user = begin
946
940
  if normalized_scheme =~ /https?/ && self.user.strip.empty? &&
947
941
  (!self.password || self.password.strip.empty?)
948
942
  nil
@@ -970,14 +964,14 @@ module Addressable
970
964
 
971
965
  # You can't have a nil user with a non-nil password
972
966
  if password != nil
973
- @user = EMPTY_STR if @user.nil?
967
+ @user = EMPTY_STR unless user
974
968
  end
975
969
 
976
970
  # Reset dependent values
977
- remove_instance_variable(:@userinfo) if defined?(@userinfo)
978
- remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
979
- remove_instance_variable(:@authority) if defined?(@authority)
980
- remove_instance_variable(:@normalized_user) if defined?(@normalized_user)
971
+ @userinfo = nil
972
+ @normalized_userinfo = NONE
973
+ @authority = nil
974
+ @normalized_user = NONE
981
975
  remove_composite_values
982
976
 
983
977
  # Ensure we haven't created an invalid URI
@@ -988,9 +982,7 @@ module Addressable
988
982
  # The password component for this URI.
989
983
  #
990
984
  # @return [String] The password component.
991
- def password
992
- return defined?(@password) ? @password : nil
993
- end
985
+ attr_reader :password
994
986
 
995
987
  ##
996
988
  # The password component for this URI, normalized.
@@ -998,8 +990,8 @@ module Addressable
998
990
  # @return [String] The password component, normalized.
999
991
  def normalized_password
1000
992
  return nil unless self.password
1001
- return @normalized_password if defined?(@normalized_password)
1002
- @normalized_password ||= begin
993
+ return @normalized_password unless @normalized_password == NONE
994
+ @normalized_password = begin
1003
995
  if self.normalized_scheme =~ /https?/ && self.password.strip.empty? &&
1004
996
  (!self.user || self.user.strip.empty?)
1005
997
  nil
@@ -1026,17 +1018,15 @@ module Addressable
1026
1018
  @password = new_password ? new_password.to_str : nil
1027
1019
 
1028
1020
  # You can't have a nil user with a non-nil password
1029
- @password ||= nil
1030
- @user ||= nil
1031
1021
  if @password != nil
1032
- @user = EMPTY_STR if @user.nil?
1022
+ self.user = EMPTY_STR if user.nil?
1033
1023
  end
1034
1024
 
1035
1025
  # Reset dependent values
1036
- remove_instance_variable(:@userinfo) if defined?(@userinfo)
1037
- remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
1038
- remove_instance_variable(:@authority) if defined?(@authority)
1039
- remove_instance_variable(:@normalized_password) if defined?(@normalized_password)
1026
+ @userinfo = nil
1027
+ @normalized_userinfo = NONE
1028
+ @authority = nil
1029
+ @normalized_password = NONE
1040
1030
  remove_composite_values
1041
1031
 
1042
1032
  # Ensure we haven't created an invalid URI
@@ -1066,8 +1056,8 @@ module Addressable
1066
1056
  # @return [String] The userinfo component, normalized.
1067
1057
  def normalized_userinfo
1068
1058
  return nil unless self.userinfo
1069
- return @normalized_userinfo if defined?(@normalized_userinfo)
1070
- @normalized_userinfo ||= begin
1059
+ return @normalized_userinfo unless @normalized_userinfo == NONE
1060
+ @normalized_userinfo = begin
1071
1061
  current_user = self.normalized_user
1072
1062
  current_password = self.normalized_password
1073
1063
  if !current_user && !current_password
@@ -1105,7 +1095,7 @@ module Addressable
1105
1095
  self.user = new_user
1106
1096
 
1107
1097
  # Reset dependent values
1108
- remove_instance_variable(:@authority) if defined?(@authority)
1098
+ @authority = nil
1109
1099
  remove_composite_values
1110
1100
 
1111
1101
  # Ensure we haven't created an invalid URI
@@ -1116,9 +1106,7 @@ module Addressable
1116
1106
  # The host component for this URI.
1117
1107
  #
1118
1108
  # @return [String] The host component.
1119
- def host
1120
- return defined?(@host) ? @host : nil
1121
- end
1109
+ attr_reader :host
1122
1110
 
1123
1111
  ##
1124
1112
  # The host component for this URI, normalized.
@@ -1161,8 +1149,8 @@ module Addressable
1161
1149
  @host = new_host ? new_host.to_str : nil
1162
1150
 
1163
1151
  # Reset dependent values
1164
- remove_instance_variable(:@authority) if defined?(@authority)
1165
- remove_instance_variable(:@normalized_host) if defined?(@normalized_host)
1152
+ @authority = nil
1153
+ @normalized_host = nil
1166
1154
  remove_composite_values
1167
1155
 
1168
1156
  # Ensure we haven't created an invalid URI
@@ -1293,14 +1281,14 @@ module Addressable
1293
1281
  end
1294
1282
 
1295
1283
  # Password assigned first to ensure validity in case of nil
1296
- self.password = defined?(new_password) ? new_password : nil
1297
- self.user = defined?(new_user) ? new_user : nil
1298
- self.host = defined?(new_host) ? new_host : nil
1299
- self.port = defined?(new_port) ? new_port : nil
1284
+ self.password = new_password
1285
+ self.user = new_user
1286
+ self.host = new_host
1287
+ self.port = new_port
1300
1288
 
1301
1289
  # Reset dependent values
1302
- remove_instance_variable(:@userinfo) if defined?(@userinfo)
1303
- remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
1290
+ @userinfo = nil
1291
+ @normalized_userinfo = NONE
1304
1292
  remove_composite_values
1305
1293
 
1306
1294
  # Ensure we haven't created an invalid URI
@@ -1348,16 +1336,16 @@ module Addressable
1348
1336
  new_port = new_origin[/:([^:@\[\]\/]*?)$/, 1]
1349
1337
  end
1350
1338
 
1351
- self.scheme = defined?(new_scheme) ? new_scheme : nil
1352
- self.host = defined?(new_host) ? new_host : nil
1353
- self.port = defined?(new_port) ? new_port : nil
1339
+ self.scheme = new_scheme
1340
+ self.host = new_host
1341
+ self.port = new_port
1354
1342
  self.userinfo = nil
1355
1343
 
1356
1344
  # Reset dependent values
1357
- remove_instance_variable(:@userinfo) if defined?(@userinfo)
1358
- remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
1359
- remove_instance_variable(:@authority) if defined?(@authority)
1360
- remove_instance_variable(:@normalized_authority) if defined?(@normalized_authority)
1345
+ @userinfo = nil
1346
+ @normalized_userinfo = NONE
1347
+ @authority = nil
1348
+ @normalized_authority = nil
1361
1349
  remove_composite_values
1362
1350
 
1363
1351
  # Ensure we haven't created an invalid URI
@@ -1384,9 +1372,7 @@ module Addressable
1384
1372
  # infer port numbers from default values.
1385
1373
  #
1386
1374
  # @return [Integer] The port component.
1387
- def port
1388
- return defined?(@port) ? @port : nil
1389
- end
1375
+ attr_reader :port
1390
1376
 
1391
1377
  ##
1392
1378
  # The port component for this URI, normalized.
@@ -1394,8 +1380,8 @@ module Addressable
1394
1380
  # @return [Integer] The port component, normalized.
1395
1381
  def normalized_port
1396
1382
  return nil unless self.port
1397
- return @normalized_port if defined?(@normalized_port)
1398
- @normalized_port ||= begin
1383
+ return @normalized_port unless @normalized_port == NONE
1384
+ @normalized_port = begin
1399
1385
  if URI.port_mapping[self.normalized_scheme] == self.port
1400
1386
  nil
1401
1387
  else
@@ -1426,8 +1412,8 @@ module Addressable
1426
1412
  @port = nil if @port == 0
1427
1413
 
1428
1414
  # Reset dependent values
1429
- remove_instance_variable(:@authority) if defined?(@authority)
1430
- remove_instance_variable(:@normalized_port) if defined?(@normalized_port)
1415
+ @authority = nil
1416
+ @normalized_port = NONE
1431
1417
  remove_composite_values
1432
1418
 
1433
1419
  # Ensure we haven't created an invalid URI
@@ -1528,9 +1514,7 @@ module Addressable
1528
1514
  # The path component for this URI.
1529
1515
  #
1530
1516
  # @return [String] The path component.
1531
- def path
1532
- return defined?(@path) ? @path : EMPTY_STR
1533
- end
1517
+ attr_reader :path
1534
1518
 
1535
1519
  NORMPATH = /^(?!\/)[^\/:]*:.*$/
1536
1520
  ##
@@ -1579,7 +1563,7 @@ module Addressable
1579
1563
  end
1580
1564
 
1581
1565
  # Reset dependent values
1582
- remove_instance_variable(:@normalized_path) if defined?(@normalized_path)
1566
+ @normalized_path = nil
1583
1567
  remove_composite_values
1584
1568
 
1585
1569
  # Ensure we haven't created an invalid URI
@@ -1609,9 +1593,7 @@ module Addressable
1609
1593
  # The query component for this URI.
1610
1594
  #
1611
1595
  # @return [String] The query component.
1612
- def query
1613
- return defined?(@query) ? @query : nil
1614
- end
1596
+ attr_reader :query
1615
1597
 
1616
1598
  ##
1617
1599
  # The query component for this URI, normalized.
@@ -1619,8 +1601,8 @@ module Addressable
1619
1601
  # @return [String] The query component, normalized.
1620
1602
  def normalized_query(*flags)
1621
1603
  return nil unless self.query
1622
- return @normalized_query if defined?(@normalized_query)
1623
- @normalized_query ||= begin
1604
+ return @normalized_query unless @normalized_query == NONE
1605
+ @normalized_query = begin
1624
1606
  modified_query_class = Addressable::URI::CharacterClasses::QUERY.dup
1625
1607
  # Make sure possible key-value pair delimiters are escaped.
1626
1608
  modified_query_class.sub!("\\&", "").sub!("\\;", "")
@@ -1652,7 +1634,7 @@ module Addressable
1652
1634
  @query = new_query ? new_query.to_str : nil
1653
1635
 
1654
1636
  # Reset dependent values
1655
- remove_instance_variable(:@normalized_query) if defined?(@normalized_query)
1637
+ @normalized_query = NONE
1656
1638
  remove_composite_values
1657
1639
  end
1658
1640
 
@@ -1814,9 +1796,7 @@ module Addressable
1814
1796
  # The fragment component for this URI.
1815
1797
  #
1816
1798
  # @return [String] The fragment component.
1817
- def fragment
1818
- return defined?(@fragment) ? @fragment : nil
1819
- end
1799
+ attr_reader :fragment
1820
1800
 
1821
1801
  ##
1822
1802
  # The fragment component for this URI, normalized.
@@ -1824,8 +1804,8 @@ module Addressable
1824
1804
  # @return [String] The fragment component, normalized.
1825
1805
  def normalized_fragment
1826
1806
  return nil unless self.fragment
1827
- return @normalized_fragment if defined?(@normalized_fragment)
1828
- @normalized_fragment ||= begin
1807
+ return @normalized_fragment unless @normalized_fragment == NONE
1808
+ @normalized_fragment = begin
1829
1809
  component = Addressable::URI.normalize_component(
1830
1810
  self.fragment,
1831
1811
  Addressable::URI::NormalizeCharacterClasses::FRAGMENT
@@ -1848,7 +1828,7 @@ module Addressable
1848
1828
  @fragment = new_fragment ? new_fragment.to_str : nil
1849
1829
 
1850
1830
  # Reset dependent values
1851
- remove_instance_variable(:@normalized_fragment) if defined?(@normalized_fragment)
1831
+ @normalized_fragment = NONE
1852
1832
  remove_composite_values
1853
1833
 
1854
1834
  # Ensure we haven't created an invalid URI
@@ -2014,7 +1994,7 @@ module Addressable
2014
1994
  #
2015
1995
  # @see Hash#merge
2016
1996
  def merge(hash)
2017
- if !hash.respond_to?(:to_hash)
1997
+ unless hash.respond_to?(:to_hash)
2018
1998
  raise TypeError, "Can't convert #{hash.class} into Hash."
2019
1999
  end
2020
2000
  hash = hash.to_hash
@@ -2408,7 +2388,27 @@ module Addressable
2408
2388
  yield
2409
2389
  @validation_deferred = false
2410
2390
  validate
2411
- return nil
2391
+ ensure
2392
+ @validation_deferred = false
2393
+ end
2394
+
2395
+ def encode_with(coder)
2396
+ instance_variables.each do |ivar|
2397
+ value = instance_variable_get(ivar)
2398
+ if value != NONE
2399
+ key = ivar.to_s.slice(1..-1)
2400
+ coder[key] = value
2401
+ end
2402
+ end
2403
+ nil
2404
+ end
2405
+
2406
+ def init_with(coder)
2407
+ reset_ivs
2408
+ coder.map.each do |key, value|
2409
+ instance_variable_set("@#{key}", value)
2410
+ end
2411
+ nil
2412
2412
  end
2413
2413
 
2414
2414
  protected
@@ -2507,11 +2507,7 @@ module Addressable
2507
2507
  # @return [Addressable::URI] <code>self</code>.
2508
2508
  def replace_self(uri)
2509
2509
  # Reset dependent values
2510
- instance_variables.each do |var|
2511
- if instance_variable_defined?(var) && var != :@validation_deferred
2512
- remove_instance_variable(var)
2513
- end
2514
- end
2510
+ reset_ivs
2515
2511
 
2516
2512
  @scheme = uri.scheme
2517
2513
  @user = uri.user
@@ -2543,8 +2539,8 @@ module Addressable
2543
2539
  #
2544
2540
  # @api private
2545
2541
  def remove_composite_values
2546
- remove_instance_variable(:@uri_string) if defined?(@uri_string)
2547
- remove_instance_variable(:@hash) if defined?(@hash)
2542
+ @uri_string = nil
2543
+ @hash = nil
2548
2544
  end
2549
2545
 
2550
2546
  ##
@@ -2556,5 +2552,40 @@ module Addressable
2556
2552
  str.force_encoding(Encoding::UTF_8)
2557
2553
  end
2558
2554
  end
2555
+
2556
+ private
2557
+
2558
+ ##
2559
+ # Resets instance variables
2560
+ #
2561
+ # @api private
2562
+ def reset_ivs
2563
+ @scheme = nil
2564
+ @user = nil
2565
+ @normalized_scheme = NONE
2566
+ @normalized_user = NONE
2567
+ @uri_string = nil
2568
+ @hash = nil
2569
+ @userinfo = nil
2570
+ @normalized_userinfo = NONE
2571
+ @authority = nil
2572
+ @password = nil
2573
+ @normalized_authority = nil
2574
+ @port = nil
2575
+ @normalized_password = NONE
2576
+ @host = nil
2577
+ @normalized_host = nil
2578
+ @normalized_port = NONE
2579
+ @path = EMPTY_STR
2580
+ @normalized_path = nil
2581
+ @normalized_query = NONE
2582
+ @fragment = nil
2583
+ @normalized_fragment = NONE
2584
+ @query = nil
2585
+ end
2586
+
2587
+ NONE = Module.new.freeze
2588
+
2589
+ private_constant :NONE
2559
2590
  end
2560
2591
  end
@@ -23,7 +23,7 @@ if !defined?(Addressable::VERSION)
23
23
  module VERSION
24
24
  MAJOR = 2
25
25
  MINOR = 8
26
- TINY = 1
26
+ TINY = 5
27
27
 
28
28
  STRING = [MAJOR, MINOR, TINY].join('.')
29
29
  end
@@ -38,6 +38,12 @@ shared_examples_for "converting from unicode to ASCII" do
38
38
  )).to eq("www.xn--8ws00zhy3a.com")
39
39
  end
40
40
 
41
+ it "also accepts unicode strings encoded as ascii-8bit" do
42
+ expect(Addressable::IDNA.to_ascii(
43
+ "www.詹姆斯.com".b
44
+ )).to eq("www.xn--8ws00zhy3a.com")
45
+ end
46
+
41
47
  it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do
42
48
  "www.Iñtërnâtiônàlizætiøn.com"
43
49
  expect(Addressable::IDNA.to_ascii(
@@ -249,11 +255,6 @@ shared_examples_for "converting from ASCII to unicode" do
249
255
  "example..host"
250
256
  )).to eq("example..host")
251
257
  end
252
-
253
- it "should normalize 'string' correctly" do
254
- expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string")
255
- expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string")
256
- end
257
258
  end
258
259
 
259
260
  describe Addressable::IDNA, "when using the pure-Ruby implementation" do