addressable 2.1.2 → 2.2.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.
data/CHANGELOG CHANGED
@@ -1,88 +1,92 @@
1
+ === Addressable 2.2.0
2
+ - added site methods
3
+ - improved documentation
4
+
1
5
  === Addressable 2.1.2
2
- * added HTTP request URI methods
3
- * better handling of Windows file paths
4
- * validation_deferred boolean replaced with defer_validation block
5
- * normalization of percent-encoded paths should now be correct
6
- * fixed issue with constructing URIs with relative paths
7
- * fixed warnings
6
+ - added HTTP request URI methods
7
+ - better handling of Windows file paths
8
+ - validation_deferred boolean replaced with defer_validation block
9
+ - normalization of percent-encoded paths should now be correct
10
+ - fixed issue with constructing URIs with relative paths
11
+ - fixed warnings
8
12
 
9
13
  === Addressable 2.1.1
10
- * more type checking changes
11
- * fixed issue with unicode normalization
12
- * added method to find template defaults
13
- * symbolic keys are now allowed in template mappings
14
- * numeric values and symbolic values are now allowed in template mappings
14
+ - more type checking changes
15
+ - fixed issue with unicode normalization
16
+ - added method to find template defaults
17
+ - symbolic keys are now allowed in template mappings
18
+ - numeric values and symbolic values are now allowed in template mappings
15
19
 
16
20
  === Addressable 2.1.0
17
- * refactored URI template support out into its own class
18
- * removed extract method due to being useless and unreliable
19
- * removed Addressable::URI.expand_template
20
- * removed Addressable::URI#extract_mapping
21
- * added partial template expansion
22
- * fixed minor bugs in the parse and heuristic_parse methods
23
- * fixed incompatibility with Ruby 1.9.1
24
- * fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s
25
- * fixed unicode normalization exception
26
- * updated query_values methods to better handle subscript notation
27
- * worked around issue with freezing URIs
28
- * improved specs
21
+ - refactored URI template support out into its own class
22
+ - removed extract method due to being useless and unreliable
23
+ - removed Addressable::URI.expand_template
24
+ - removed Addressable::URI#extract_mapping
25
+ - added partial template expansion
26
+ - fixed minor bugs in the parse and heuristic_parse methods
27
+ - fixed incompatibility with Ruby 1.9.1
28
+ - fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s
29
+ - fixed unicode normalization exception
30
+ - updated query_values methods to better handle subscript notation
31
+ - worked around issue with freezing URIs
32
+ - improved specs
29
33
 
30
34
  === Addressable 2.0.2
31
- * fixed issue with URI template expansion
32
- * fixed issue with percent escaping characters 0-15
35
+ - fixed issue with URI template expansion
36
+ - fixed issue with percent escaping characters 0-15
33
37
 
34
38
  === Addressable 2.0.1
35
- * fixed issue with query string assignment
36
- * fixed issue with improperly encoded components
39
+ - fixed issue with query string assignment
40
+ - fixed issue with improperly encoded components
37
41
 
38
42
  === Addressable 2.0.0
39
- * the initialize method now takes an options hash as its only parameter
40
- * added query_values method to URI class
41
- * completely replaced IDNA implementation with pure Ruby
42
- * renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION
43
- * completely reworked the Rakefile
44
- * changed the behavior of the port method significantly
45
- * Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed
46
- * documentation is now in YARD format
47
- * more rigorous type checking
48
- * to_str method implemented, implicit conversion to Strings now allowed
49
- * Addressable::URI#omit method added, Addressable::URI#merge method replaced
50
- * updated URI Template code to match v 03 of the draft spec
51
- * added a bunch of new specifications
43
+ - the initialize method now takes an options hash as its only parameter
44
+ - added query_values method to URI class
45
+ - completely replaced IDNA implementation with pure Ruby
46
+ - renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION
47
+ - completely reworked the Rakefile
48
+ - changed the behavior of the port method significantly
49
+ - Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed
50
+ - documentation is now in YARD format
51
+ - more rigorous type checking
52
+ - to_str method implemented, implicit conversion to Strings now allowed
53
+ - Addressable::URI#omit method added, Addressable::URI#merge method replaced
54
+ - updated URI Template code to match v 03 of the draft spec
55
+ - added a bunch of new specifications
52
56
 
53
57
  === Addressable 1.0.4
54
- * switched to using RSpec's pending system for specs that rely on IDN
55
- * fixed issue with creating URIs with paths that are not prefixed with '/'
58
+ - switched to using RSpec's pending system for specs that rely on IDN
59
+ - fixed issue with creating URIs with paths that are not prefixed with '/'
56
60
 
57
61
  === Addressable 1.0.3
58
- * implemented a hash method
62
+ - implemented a hash method
59
63
 
60
64
  === Addressable 1.0.2
61
- * fixed minor bug with the extract_mapping method
65
+ - fixed minor bug with the extract_mapping method
62
66
 
63
67
  === Addressable 1.0.1
64
- * fixed minor bug with the extract_mapping method
68
+ - fixed minor bug with the extract_mapping method
65
69
 
66
70
  === Addressable 1.0.0
67
- * heuristic parse method added
68
- * parsing is slightly more strict
69
- * replaced to_h with to_hash
70
- * fixed routing methods
71
- * improved specifications
72
- * improved heckle rake task
73
- * no surviving heckle mutations
71
+ - heuristic parse method added
72
+ - parsing is slightly more strict
73
+ - replaced to_h with to_hash
74
+ - fixed routing methods
75
+ - improved specifications
76
+ - improved heckle rake task
77
+ - no surviving heckle mutations
74
78
 
75
79
  === Addressable 0.1.2
76
- * improved normalization
77
- * fixed bug in joining algorithm
78
- * updated specifications
80
+ - improved normalization
81
+ - fixed bug in joining algorithm
82
+ - updated specifications
79
83
 
80
84
  === Addressable 0.1.1
81
- * updated documentation
82
- * added URI Template variable extraction
85
+ - updated documentation
86
+ - added URI Template variable extraction
83
87
 
84
88
  === Addressable 0.1.0
85
- * initial release
86
- * implementation based on RFC 3986, 3987
87
- * support for IRIs via libidn
88
- * support for the URI Template draft spec
89
+ - initial release
90
+ - implementation based on RFC 3986, 3987
91
+ - support for IRIs via libidn
92
+ - support for the URI Template draft spec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Addressable, Copyright (c) 2006-2008 Bob Aman
1
+ Addressable, Copyright (c) 2006-2010 Bob Aman
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README CHANGED
@@ -1,10 +1,20 @@
1
+ == About
2
+
3
+ Homepage:: Addressable[http://addressable.rubyforge.org/]
4
+ Authors:: Bob Aman (mailto:bob@sporkmonger.com)
5
+ Copyright:: Copyright 2010 Bob Aman
6
+ License:: MIT
7
+
1
8
  Addressable is a replacement for the URI implementation that is part of
2
9
  Ruby's standard library. It more closely conforms to the relevant RFCs and
3
10
  adds support for IRIs and URI templates. Additionally, it provides extensive
4
11
  support for URI templates.
5
12
 
6
- Example usage:
7
-
13
+ == Classes
14
+ - {Addressable::URI}
15
+ - {Addressable::Template}
16
+
17
+ == Example usage
8
18
  require "addressable/uri"
9
19
 
10
20
  uri = Addressable::URI.parse("http://example.com/path/to/resource/")
data/Rakefile CHANGED
@@ -27,38 +27,6 @@ Ruby's standard library. It more closely conforms to the relevant RFCs and
27
27
  adds support for IRIs and URI templates.
28
28
  TEXT
29
29
 
30
- desc "generates .gemspec file"
31
- task :gemspec do
32
- spec = Gem::Specification.new do |p|
33
- p.name = 'addressable'
34
- p.version = PKG_VERSION
35
-
36
- p.summary = PKG_SUMMARY
37
- p.description = PKG_DESCRIPTION
38
-
39
- p.author = 'Bob Aman'
40
- p.email = 'bob@sporkmonger.com'
41
- p.homepage = 'http://github.com/mislav/addressable'
42
- p.rubyforge_project = nil
43
-
44
- p.files = FileList['Rakefile', '{bin,lib,tasks,spec}/**/*', 'README*', 'LICENSE*', 'CHANGELOG*'] & `git ls-files`.split
45
-
46
- p.executables = Dir['bin/*'].map { |f| File.basename(f) }
47
-
48
- p.has_rdoc = true
49
- end
50
-
51
- spec_string = spec.to_ruby
52
-
53
- begin
54
- Thread.new { eval("$SAFE = 3\n#{spec_string}", binding) }.join
55
- rescue
56
- abort "unsafe gemspec: #{$!}"
57
- else
58
- File.open("#{spec.name}.gemspec", 'w') { |file| file.write spec_string }
59
- end
60
- end
61
-
62
30
  PKG_FILES = FileList[
63
31
  "lib/**/*", "spec/**/*", "vendor/**/*",
64
32
  "tasks/**/*", "website/**/*",
@@ -1,6 +1,6 @@
1
1
  # encoding:utf-8
2
2
  #--
3
- # Addressable, Copyright (c) 2006-2008 Bob Aman
3
+ # Addressable, Copyright (c) 2006-2010 Bob Aman
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining
6
6
  # a copy of this software and associated documentation files (the
@@ -1,6 +1,6 @@
1
1
  # encoding:utf-8
2
2
  #--
3
- # Addressable, Copyright (c) 2006-2008 Bob Aman
3
+ # Addressable, Copyright (c) 2006-2010 Bob Aman
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining
6
6
  # a copy of this software and associated documentation files (the
@@ -58,9 +58,9 @@ module Addressable
58
58
  # Returns a URI object based on the parsed string.
59
59
  #
60
60
  # @param [String, Addressable::URI, #to_str] uri
61
- # The URI string to parse.
62
- # No parsing is performed if the object is already an
63
- # <tt>Addressable::URI</tt>.
61
+ # The URI string to parse.
62
+ # No parsing is performed if the object is already an
63
+ # <code>Addressable::URI</code>.
64
64
  #
65
65
  # @return [Addressable::URI] The parsed URI.
66
66
  def self.parse(uri)
@@ -130,11 +130,11 @@ module Addressable
130
130
  #
131
131
  # @param [String, Addressable::URI, #to_str] uri
132
132
  # The URI string to parse.
133
- # No parsing is performed if the object is already an
134
- # <tt>Addressable::URI</tt>.
133
+ # No parsing is performed if the object is already an
134
+ # <code>Addressable::URI</code>.
135
135
  # @param [Hash] hints
136
- # A <tt>Hash</tt> of hints to the heuristic parser.
137
- # Defaults to <tt>{:scheme => "http"}</tt>.
136
+ # A <code>Hash</code> of hints to the heuristic parser.
137
+ # Defaults to <code>{:scheme => "http"}</code>.
138
138
  #
139
139
  # @return [Addressable::URI] The parsed URI.
140
140
  def self.heuristic_parse(uri, hints={})
@@ -183,13 +183,13 @@ module Addressable
183
183
  # Converts a path to a file scheme URI. If the path supplied is
184
184
  # relative, it will be returned as a relative URI. If the path supplied
185
185
  # is actually a non-file URI, it will parse the URI as if it had been
186
- # parsed with <tt>Addressable::URI.parse</tt>. Handles all of the
186
+ # parsed with <code>Addressable::URI.parse</code>. Handles all of the
187
187
  # various Microsoft-specific formats for specifying paths.
188
188
  #
189
189
  # @param [String, Addressable::URI, #to_str] path
190
- #
191
- # Typically a <tt>String</tt> path to a file or directory, but will return
192
- # a sensible return value if an absolute URI is supplied instead.
190
+ # Typically a <code>String</code> path to a file or directory, but
191
+ # will return a sensible return value if an absolute URI is supplied
192
+ # instead.
193
193
  #
194
194
  # @return [Addressable::URI]
195
195
  # The parsed file scheme URI or the original URI if some other URI
@@ -279,17 +279,17 @@ module Addressable
279
279
  # @param [String, #to_str] component The URI component to encode.
280
280
  #
281
281
  # @param [String, Regexp] character_class
282
- #
283
- # The characters which are not percent encoded. If a <tt>String</tt> is
284
- # passed, the <tt>String</tt> must be formatted as a regular expression
285
- # character class. (Do not include the surrounding square brackets.) For
286
- # example, <tt>"b-zB-Z0-9"</tt> would cause everything but the letters 'b'
287
- # through 'z' and the numbers '0' through '9' to be percent encoded. If a
288
- # <tt>Regexp</tt> is passed, the value <tt>/[^b-zB-Z0-9]/</tt> would have
289
- # the same effect. A set of useful <tt>String</tt> values may be found in
290
- # the <tt>Addressable::URI::CharacterClasses</tt> module. The default
291
- # value is the reserved plus unreserved character classes specified in <a
292
- # href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
282
+ # The characters which are not percent encoded. If a <code>String</code>
283
+ # is passed, the <code>String</code> must be formatted as a regular
284
+ # expression character class. (Do not include the surrounding square
285
+ # brackets.) For example, <code>"b-zB-Z0-9"</code> would cause
286
+ # everything but the letters 'b' through 'z' and the numbers '0' through
287
+ # '9' to be percent encoded. If a <code>Regexp</code> is passed, the
288
+ # value <code>/[^b-zB-Z0-9]/</code> would have the same effect. A set of
289
+ # useful <code>String</code> values may be found in the
290
+ # <code>Addressable::URI::CharacterClasses</code> module. The default
291
+ # value is the reserved plus unreserved character classes specified in
292
+ # <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
293
293
  #
294
294
  # @return [String] The encoded component.
295
295
  #
@@ -334,21 +334,21 @@ module Addressable
334
334
  ##
335
335
  # Unencodes any percent encoded characters within a URI component.
336
336
  # This method may be used for unencoding either components or full URIs,
337
- # however, it is recommended to use the <tt>unencode_component</tt> alias
338
- # when unencoding components.
337
+ # however, it is recommended to use the <code>unencode_component</code>
338
+ # alias when unencoding components.
339
339
  #
340
340
  # @param [String, Addressable::URI, #to_str] uri
341
341
  # The URI or component to unencode.
342
342
  #
343
343
  # @param [Class] returning
344
344
  # The type of object to return.
345
- # This value may only be set to <tt>String</tt> or
346
- # <tt>Addressable::URI</tt>. All other values are invalid. Defaults to
347
- # <tt>String</tt>.
345
+ # This value may only be set to <code>String</code> or
346
+ # <code>Addressable::URI</code>. All other values are invalid. Defaults
347
+ # to <code>String</code>.
348
348
  #
349
349
  # @return [String, Addressable::URI]
350
350
  # The unencoded component or URI.
351
- # The return type is determined by the <tt>returning</tt> parameter.
351
+ # The return type is determined by the <code>returning</code> parameter.
352
352
  def self.unencode(uri, returning=String)
353
353
  return nil if uri.nil?
354
354
  if !uri.respond_to?(:to_str)
@@ -383,17 +383,17 @@ module Addressable
383
383
  # @param [String, #to_str] component The URI component to encode.
384
384
  #
385
385
  # @param [String, Regexp] character_class
386
- #
387
- # The characters which are not percent encoded. If a <tt>String</tt> is
388
- # passed, the <tt>String</tt> must be formatted as a regular expression
389
- # character class. (Do not include the surrounding square brackets.) For
390
- # example, <tt>"b-zB-Z0-9"</tt> would cause everything but the letters 'b'
391
- # through 'z' and the numbers '0' through '9' to be percent encoded. If a
392
- # <tt>Regexp</tt> is passed, the value <tt>/[^b-zB-Z0-9]/</tt> would have
393
- # the same effect. A set of useful <tt>String</tt> values may be found in
394
- # the <tt>Addressable::URI::CharacterClasses</tt> module. The default
395
- # value is the reserved plus unreserved character classes specified in <a
396
- # href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
386
+ # The characters which are not percent encoded. If a <code>String</code>
387
+ # is passed, the <code>String</code> must be formatted as a regular
388
+ # expression character class. (Do not include the surrounding square
389
+ # brackets.) For example, <code>"b-zB-Z0-9"</code> would cause
390
+ # everything but the letters 'b' through 'z' and the numbers '0' through
391
+ # '9' to be percent encoded. If a <code>Regexp</code> is passed, the
392
+ # value <code>/[^b-zB-Z0-9]/</code> would have the same effect. A set of
393
+ # useful <code>String</code> values may be found in the
394
+ # <code>Addressable::URI::CharacterClasses</code> module. The default
395
+ # value is the reserved plus unreserved character classes specified in
396
+ # <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
397
397
  #
398
398
  # @return [String] The normalized component.
399
399
  #
@@ -449,13 +449,13 @@ module Addressable
449
449
  #
450
450
  # @param [Class] returning
451
451
  # The type of object to return.
452
- # This value may only be set to <tt>String</tt> or
453
- # <tt>Addressable::URI</tt>. All other values are invalid. Defaults to
454
- # <tt>String</tt>.
452
+ # This value may only be set to <code>String</code> or
453
+ # <code>Addressable::URI</code>. All other values are invalid. Defaults
454
+ # to <code>String</code>.
455
455
  #
456
456
  # @return [String, Addressable::URI]
457
457
  # The encoded URI.
458
- # The return type is determined by the <tt>returning</tt> parameter.
458
+ # The return type is determined by the <code>returning</code> parameter.
459
459
  def self.encode(uri, returning=String)
460
460
  return nil if uri.nil?
461
461
  if !uri.respond_to?(:to_str)
@@ -499,13 +499,13 @@ module Addressable
499
499
  #
500
500
  # @param [Class] returning
501
501
  # The type of object to return.
502
- # This value may only be set to <tt>String</tt> or
503
- # <tt>Addressable::URI</tt>. All other values are invalid. Defaults to
504
- # <tt>String</tt>.
502
+ # This value may only be set to <code>String</code> or
503
+ # <code>Addressable::URI</code>. All other values are invalid. Defaults
504
+ # to <code>String</code>.
505
505
  #
506
506
  # @return [String, Addressable::URI]
507
- # The encoded URI.
508
- # The return type is determined by the <tt>returning</tt> parameter.
507
+ # The encoded URI.
508
+ # The return type is determined by the <code>returning</code> parameter.
509
509
  def self.normalized_encode(uri, returning=String)
510
510
  if !uri.respond_to?(:to_str)
511
511
  raise TypeError, "Can't convert #{uri.class} into String."
@@ -649,13 +649,19 @@ module Addressable
649
649
 
650
650
  if new_scheme && !new_scheme.respond_to?(:to_str)
651
651
  raise TypeError, "Can't convert #{new_scheme.class} into String."
652
+ elsif new_scheme
653
+ new_scheme = new_scheme.to_str
654
+ end
655
+ if new_scheme && new_scheme !~ /[a-z][a-z0-9\.\+\-]*/i
656
+ raise InvalidURIError, "Invalid scheme format."
652
657
  end
653
- @scheme = new_scheme ? new_scheme.to_str : nil
658
+ @scheme = new_scheme
654
659
  @scheme = nil if @scheme.to_s.strip == ""
655
660
 
656
661
  # Reset dependant values
657
662
  @normalized_scheme = nil
658
663
  @uri_string = nil
664
+ @hash = nil
659
665
 
660
666
  # Ensure we haven't created an invalid URI
661
667
  validate()
@@ -716,6 +722,7 @@ module Addressable
716
722
  @authority = nil
717
723
  @normalized_user = nil
718
724
  @uri_string = nil
725
+ @hash = nil
719
726
 
720
727
  # Ensure we haven't created an invalid URI
721
728
  validate()
@@ -777,6 +784,7 @@ module Addressable
777
784
  @authority = nil
778
785
  @normalized_password = nil
779
786
  @uri_string = nil
787
+ @hash = nil
780
788
 
781
789
  # Ensure we haven't created an invalid URI
782
790
  validate()
@@ -846,6 +854,7 @@ module Addressable
846
854
  # Reset dependant values
847
855
  @authority = nil
848
856
  @uri_string = nil
857
+ @hash = nil
849
858
 
850
859
  # Ensure we haven't created an invalid URI
851
860
  validate()
@@ -901,6 +910,7 @@ module Addressable
901
910
  @authority = nil
902
911
  @normalized_host = nil
903
912
  @uri_string = nil
913
+ @hash = nil
904
914
 
905
915
  # Ensure we haven't created an invalid URI
906
916
  validate()
@@ -986,6 +996,7 @@ module Addressable
986
996
  @userinfo = nil
987
997
  @normalized_userinfo = nil
988
998
  @uri_string = nil
999
+ @hash = nil
989
1000
 
990
1001
  # Ensure we haven't created an invalid URI
991
1002
  validate()
@@ -993,7 +1004,7 @@ module Addressable
993
1004
 
994
1005
  # Returns an array of known ip-based schemes. These schemes typically
995
1006
  # use a similar URI form:
996
- # //<user>:<password>@<host>:<port>/<url-path>
1007
+ # <code>//<user>:<password>@<host>:<port>/<url-path></code>
997
1008
  def self.ip_based_schemes
998
1009
  return self.port_mapping.keys
999
1010
  end
@@ -1067,6 +1078,7 @@ module Addressable
1067
1078
  @inferred_port = nil
1068
1079
  @normalized_port = nil
1069
1080
  @uri_string = nil
1081
+ @hash = nil
1070
1082
 
1071
1083
  # Ensure we haven't created an invalid URI
1072
1084
  validate()
@@ -1092,6 +1104,76 @@ module Addressable
1092
1104
  end)
1093
1105
  end
1094
1106
 
1107
+ ##
1108
+ # The combination of components that represent a site.
1109
+ # Combines the scheme, user, password, host, and port components.
1110
+ # Primarily useful for HTTP and HTTPS.
1111
+ #
1112
+ # For example, <code>"http://example.com/path?query"</code> would have a
1113
+ # <code>site</code> value of <code>"http://example.com"</code>.
1114
+ #
1115
+ # @return [String] The components that identify a site.
1116
+ def site
1117
+ @site ||= (begin
1118
+ if self.scheme || self.authority
1119
+ site_string = ""
1120
+ site_string << "#{self.scheme}:" if self.scheme != nil
1121
+ site_string << "//#{self.authority}" if self.authority != nil
1122
+ site_string
1123
+ else
1124
+ nil
1125
+ end
1126
+ end)
1127
+ end
1128
+
1129
+ ##
1130
+ # The normalized combination of components that represent a site.
1131
+ # Combines the scheme, user, password, host, and port components.
1132
+ # Primarily useful for HTTP and HTTPS.
1133
+ #
1134
+ # For example, <code>"http://example.com/path?query"</code> would have a
1135
+ # <code>site</code> value of <code>"http://example.com"</code>.
1136
+ #
1137
+ # @return [String] The normalized components that identify a site.
1138
+ def normalized_site
1139
+ @site ||= (begin
1140
+ if self.normalized_scheme || self.normalized_authority
1141
+ site_string = ""
1142
+ if self.normalized_scheme != nil
1143
+ site_string << "#{self.normalized_scheme}:"
1144
+ end
1145
+ if self.normalized_authority != nil
1146
+ site_string << "//#{self.normalized_authority}"
1147
+ end
1148
+ site_string
1149
+ else
1150
+ nil
1151
+ end
1152
+ end)
1153
+ end
1154
+
1155
+ ##
1156
+ # Sets the site value for this URI.
1157
+ #
1158
+ # @param [String, #to_str] new_site The new site value.
1159
+ def site=(new_site)
1160
+ if new_site
1161
+ if !new_site.respond_to?(:to_str)
1162
+ raise TypeError, "Can't convert #{new_site.class} into String."
1163
+ end
1164
+ new_site = new_site.to_str
1165
+ # These two regular expressions derived from the primary parsing
1166
+ # expression
1167
+ self.scheme = new_site[/^(?:([^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?$/, 1]
1168
+ self.authority = new_site[
1169
+ /^(?:(?:[^:\/?#]+):)?(?:\/\/([^\/?#]*))?$/, 1
1170
+ ]
1171
+ else
1172
+ self.scheme = nil
1173
+ self.authority = nil
1174
+ end
1175
+ end
1176
+
1095
1177
  ##
1096
1178
  # The path component for this URI.
1097
1179
  #
@@ -1148,6 +1230,7 @@ module Addressable
1148
1230
  # Reset dependant values
1149
1231
  @normalized_path = nil
1150
1232
  @uri_string = nil
1233
+ @hash = nil
1151
1234
  end
1152
1235
 
1153
1236
  ##
@@ -1210,15 +1293,16 @@ module Addressable
1210
1293
  # Reset dependant values
1211
1294
  @normalized_query = nil
1212
1295
  @uri_string = nil
1296
+ @hash = nil
1213
1297
  end
1214
1298
 
1215
1299
  ##
1216
1300
  # Converts the query component to a Hash value.
1217
1301
  #
1218
1302
  # @option [Symbol] notation
1219
- # May be one of <tt>:flat</tt>, <tt>:dot</tt>, or <tt>:subscript</tt>.
1220
- # The <tt>:dot</tt> notation is not supported for assignment. Default
1221
- # value is <tt>:subscript</tt>.
1303
+ # May be one of <code>:flat</code>, <code>:dot</code>, or
1304
+ # <code>:subscript</code>. The <code>:dot</code> notation is not
1305
+ # supported for assignment. Default value is <code>:subscript</code>.
1222
1306
  #
1223
1307
  # @return [Hash] The query string parsed as a Hash object.
1224
1308
  #
@@ -1266,8 +1350,8 @@ module Addressable
1266
1350
  end
1267
1351
  return nil if self.query == nil
1268
1352
  return ((self.query.split("&").map do |pair|
1269
- pair.split("=")
1270
- end).inject({}) do |accumulator, (key, value)|
1353
+ pair.split("=", -1) if pair && pair != ""
1354
+ end).compact.inject({}) do |accumulator, (key, value)|
1271
1355
  value = true if value.nil?
1272
1356
  key = self.class.unencode_component(key)
1273
1357
  if value != true
@@ -1309,15 +1393,25 @@ module Addressable
1309
1393
  ##
1310
1394
  # Sets the query component for this URI from a Hash object.
1311
1395
  # This method produces a query string using the :subscript notation.
1396
+ # An empty Hash will result in a nil query.
1312
1397
  #
1313
1398
  # @param [Hash, #to_hash] new_query_values The new query values.
1314
1399
  def query_values=(new_query_values)
1315
1400
  # Check for frozenness
1316
1401
  raise TypeError, "Can't modify frozen URI." if self.frozen?
1402
+ if new_query_values == nil
1403
+ self.query = nil
1404
+ return nil
1405
+ end
1317
1406
  if !new_query_values.respond_to?(:to_hash)
1318
1407
  raise TypeError, "Can't convert #{new_query_values.class} into Hash."
1319
1408
  end
1320
1409
  new_query_values = new_query_values.to_hash
1410
+ new_query_values = new_query_values.map do |key, value|
1411
+ key = key.to_s if key.kind_of?(Symbol)
1412
+ [key, value]
1413
+ end
1414
+ new_query_values.sort! # Useful default for OAuth and caching
1321
1415
 
1322
1416
  # Algorithm shamelessly stolen from Julien Genestoux, slightly modified
1323
1417
  buffer = ""
@@ -1351,11 +1445,7 @@ module Addressable
1351
1445
  end
1352
1446
  end
1353
1447
  end
1354
- @query = buffer.chop
1355
-
1356
- # Reset dependant values
1357
- @normalized_query = nil
1358
- @uri_string = nil
1448
+ self.query = buffer.chop
1359
1449
  end
1360
1450
 
1361
1451
  ##
@@ -1393,6 +1483,7 @@ module Addressable
1393
1483
 
1394
1484
  # Reset dependant values
1395
1485
  @uri_string = nil
1486
+ @hash = nil
1396
1487
  end
1397
1488
 
1398
1489
  ##
@@ -1436,6 +1527,7 @@ module Addressable
1436
1527
  # Reset dependant values
1437
1528
  @normalized_fragment = nil
1438
1529
  @uri_string = nil
1530
+ @hash = nil
1439
1531
 
1440
1532
  # Ensure we haven't created an invalid URI
1441
1533
  validate()
@@ -1445,8 +1537,8 @@ module Addressable
1445
1537
  # Determines if the scheme indicates an IP-based protocol.
1446
1538
  #
1447
1539
  # @return [TrueClass, FalseClass]
1448
- # <tt>true</tt> if the scheme indicates an IP-based protocol.
1449
- # <tt>false</tt> otherwise.
1540
+ # <code>true</code> if the scheme indicates an IP-based protocol.
1541
+ # <code>false</code> otherwise.
1450
1542
  def ip_based?
1451
1543
  if self.scheme
1452
1544
  return self.class.ip_based_schemes.include?(
@@ -1459,7 +1551,8 @@ module Addressable
1459
1551
  # Determines if the URI is relative.
1460
1552
  #
1461
1553
  # @return [TrueClass, FalseClass]
1462
- # <tt>true</tt> if the URI is relative. <tt>false</tt> otherwise.
1554
+ # <code>true</code> if the URI is relative. <code>false</code>
1555
+ # otherwise.
1463
1556
  def relative?
1464
1557
  return self.scheme.nil?
1465
1558
  end
@@ -1468,7 +1561,8 @@ module Addressable
1468
1561
  # Determines if the URI is absolute.
1469
1562
  #
1470
1563
  # @return [TrueClass, FalseClass]
1471
- # <tt>true</tt> if the URI is absolute. <tt>false</tt> otherwise.
1564
+ # <code>true</code> if the URI is absolute. <code>false</code>
1565
+ # otherwise.
1472
1566
  def absolute?
1473
1567
  return !relative?
1474
1568
  end
@@ -1575,7 +1669,7 @@ module Addressable
1575
1669
  alias_method :+, :join
1576
1670
 
1577
1671
  ##
1578
- # Destructive form of <tt>join</tt>.
1672
+ # Destructive form of <code>join</code>.
1579
1673
  #
1580
1674
  # @param [String, Addressable::URI, #to_str] The URI to join with.
1581
1675
  #
@@ -1587,10 +1681,10 @@ module Addressable
1587
1681
  end
1588
1682
 
1589
1683
  ##
1590
- # Merges a URI with a <tt>Hash</tt> of components.
1591
- # This method has different behavior from <tt>join</tt>. Any components
1592
- # present in the <tt>hash</tt> parameter will override the original
1593
- # components. The path component is not treated specially.
1684
+ # Merges a URI with a <code>Hash</code> of components.
1685
+ # This method has different behavior from <code>join</code>. Any
1686
+ # components present in the <code>hash</code> parameter will override the
1687
+ # original components. The path component is not treated specially.
1594
1688
  #
1595
1689
  # @param [Hash, Addressable::URI, #to_hash] The components to merge with.
1596
1690
  #
@@ -1655,7 +1749,7 @@ module Addressable
1655
1749
  end
1656
1750
 
1657
1751
  ##
1658
- # Destructive form of <tt>merge</tt>.
1752
+ # Destructive form of <code>merge</code>.
1659
1753
  #
1660
1754
  # @param [Hash, Addressable::URI, #to_hash] The components to merge with.
1661
1755
  #
@@ -1669,7 +1763,7 @@ module Addressable
1669
1763
  ##
1670
1764
  # Returns the shortest normalized relative form of this URI that uses the
1671
1765
  # supplied URI as a base for resolution. Returns an absolute URI if
1672
- # necessary. This is effectively the opposite of <tt>route_to</tt>.
1766
+ # necessary. This is effectively the opposite of <code>route_to</code>.
1673
1767
  #
1674
1768
  # @param [String, Addressable::URI, #to_str] uri The URI to route from.
1675
1769
  #
@@ -1727,7 +1821,7 @@ module Addressable
1727
1821
  ##
1728
1822
  # Returns the shortest normalized relative form of the supplied URI that
1729
1823
  # uses this URI as a base for resolution. Returns an absolute URI if
1730
- # necessary. This is effectively the opposite of <tt>route_from</tt>.
1824
+ # necessary. This is effectively the opposite of <code>route_from</code>.
1731
1825
  #
1732
1826
  # @param [String, Addressable::URI, #to_str] uri The URI to route to.
1733
1827
  #
@@ -1791,14 +1885,15 @@ module Addressable
1791
1885
  end
1792
1886
 
1793
1887
  ##
1794
- # Returns <tt>true</tt> if the URI objects are equal. This method
1888
+ # Returns <code>true</code> if the URI objects are equal. This method
1795
1889
  # normalizes both URIs before doing the comparison, and allows comparison
1796
- # against <tt>Strings</tt>.
1890
+ # against <code>Strings</code>.
1797
1891
  #
1798
1892
  # @param [Object] uri The URI to compare.
1799
1893
  #
1800
1894
  # @return [TrueClass, FalseClass]
1801
- # <tt>true</tt> if the URIs are equivalent, <tt>false</tt> otherwise.
1895
+ # <code>true</code> if the URIs are equivalent, <code>false</code>
1896
+ # otherwise.
1802
1897
  def ===(uri)
1803
1898
  if uri.respond_to?(:normalize)
1804
1899
  uri_string = uri.normalize.to_s
@@ -1813,26 +1908,28 @@ module Addressable
1813
1908
  end
1814
1909
 
1815
1910
  ##
1816
- # Returns <tt>true</tt> if the URI objects are equal. This method
1911
+ # Returns <code>true</code> if the URI objects are equal. This method
1817
1912
  # normalizes both URIs before doing the comparison.
1818
1913
  #
1819
1914
  # @param [Object] uri The URI to compare.
1820
1915
  #
1821
1916
  # @return [TrueClass, FalseClass]
1822
- # <tt>true</tt> if the URIs are equivalent, <tt>false</tt> otherwise.
1917
+ # <code>true</code> if the URIs are equivalent, <code>false</code>
1918
+ # otherwise.
1823
1919
  def ==(uri)
1824
1920
  return false unless uri.kind_of?(self.class)
1825
1921
  return self.normalize.to_s == uri.normalize.to_s
1826
1922
  end
1827
1923
 
1828
1924
  ##
1829
- # Returns <tt>true</tt> if the URI objects are equal. This method
1925
+ # Returns <code>true</code> if the URI objects are equal. This method
1830
1926
  # does NOT normalize either URI before doing the comparison.
1831
1927
  #
1832
1928
  # @param [Object] uri The URI to compare.
1833
1929
  #
1834
1930
  # @return [TrueClass, FalseClass]
1835
- # <tt>true</tt> if the URIs are equivalent, <tt>false</tt> otherwise.
1931
+ # <code>true</code> if the URIs are equivalent, <code>false</code>
1932
+ # otherwise.
1836
1933
  def eql?(uri)
1837
1934
  return false unless uri.kind_of?(self.class)
1838
1935
  return self.to_s == uri.to_s
@@ -1882,7 +1979,7 @@ module Addressable
1882
1979
  # Determines if the URI is frozen.
1883
1980
  #
1884
1981
  # @return [TrueClass, FalseClass]
1885
- # True if the URI is frozen, false otherwise.
1982
+ # <code>true</code> if the URI is frozen, <code>false</code> otherwise.
1886
1983
  def frozen?
1887
1984
  self.to_s.frozen?
1888
1985
  end
@@ -1931,9 +2028,9 @@ module Addressable
1931
2028
  end
1932
2029
 
1933
2030
  ##
1934
- # Converts the URI to a <tt>String</tt>.
2031
+ # Converts the URI to a <code>String</code>.
1935
2032
  #
1936
- # @return [String] The URI's <tt>String</tt> representation.
2033
+ # @return [String] The URI's <code>String</code> representation.
1937
2034
  def to_s
1938
2035
  @uri_string ||= (begin
1939
2036
  uri_string = ""
@@ -1950,13 +2047,13 @@ module Addressable
1950
2047
  end
1951
2048
 
1952
2049
  ##
1953
- # URI's are glorified <tt>Strings</tt>. Allow implicit conversion.
2050
+ # URI's are glorified <code>Strings</code>. Allow implicit conversion.
1954
2051
  alias_method :to_str, :to_s
1955
2052
 
1956
2053
  ##
1957
2054
  # Returns a Hash of the URI components.
1958
2055
  #
1959
- # @return [Hash] The URI as a <tt>Hash</tt> of components.
2056
+ # @return [Hash] The URI as a <code>Hash</code> of components.
1960
2057
  def to_hash
1961
2058
  return {
1962
2059
  :scheme => self.scheme,
@@ -1971,9 +2068,9 @@ module Addressable
1971
2068
  end
1972
2069
 
1973
2070
  ##
1974
- # Returns a <tt>String</tt> representation of the URI object's state.
2071
+ # Returns a <code>String</code> representation of the URI object's state.
1975
2072
  #
1976
- # @return [String] The URI object's state, as a <tt>String</tt>.
2073
+ # @return [String] The URI object's state, as a <code>String</code>.
1977
2074
  def inspect
1978
2075
  sprintf("#<%s:%#0x URI:%s>", self.class.to_s, self.object_id, self.to_s)
1979
2076
  end
@@ -2055,9 +2152,9 @@ module Addressable
2055
2152
  # Replaces the internal state of self with the specified URI's state.
2056
2153
  # Used in destructive operations to avoid massive code repetition.
2057
2154
  #
2058
- # @param [Addressable::URI] uri The URI to replace <tt>self</tt> with.
2155
+ # @param [Addressable::URI] uri The URI to replace <code>self</code> with.
2059
2156
  #
2060
- # @return [Addressable::URI] <tt>self</tt>.
2157
+ # @return [Addressable::URI] <code>self</code>.
2061
2158
  def replace_self(uri)
2062
2159
  # Reset dependant values
2063
2160
  instance_variables.each do |var|