addressable 0.1.2 → 1.0.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.
@@ -89,8 +89,8 @@ returning nil if libidn can‘t be used.
89
89
  <h3 class="section-bar">Methods</h3>
90
90
 
91
91
  <div class="name-list">
92
- <a href="#M000057">to_ascii</a>&nbsp;&nbsp;
93
- <a href="#M000058">to_unicode</a>&nbsp;&nbsp;
92
+ <a href="#M000058">to_ascii</a>&nbsp;&nbsp;
93
+ <a href="#M000059">to_unicode</a>&nbsp;&nbsp;
94
94
  </div>
95
95
  </div>
96
96
 
@@ -112,11 +112,11 @@ returning nil if libidn can&#8216;t be used.
112
112
  <div id="methods">
113
113
  <h3 class="section-bar">Public Class methods</h3>
114
114
 
115
- <div id="method-M000057" class="method-detail">
116
- <a name="M000057"></a>
115
+ <div id="method-M000058" class="method-detail">
116
+ <a name="M000058"></a>
117
117
 
118
118
  <div class="method-heading">
119
- <a href="#M000057" class="method-signature">
119
+ <a href="#M000058" class="method-signature">
120
120
  <span class="method-name">to_ascii</span><span class="method-args">(label)</span>
121
121
  </a>
122
122
  </div>
@@ -126,30 +126,30 @@ returning nil if libidn can&#8216;t be used.
126
126
  Returns the ascii representation of the label.
127
127
  </p>
128
128
  <p><a class="source-toggle" href="#"
129
- onclick="toggleCode('M000057-source');return false;">[Source]</a></p>
130
- <div class="method-source-code" id="M000057-source">
129
+ onclick="toggleCode('M000058-source');return false;">[Source]</a></p>
130
+ <div class="method-source-code" id="M000058-source">
131
131
  <pre>
132
- <span class="ruby-comment cmt"># File lib/addressable/uri.rb, line 1103</span>
133
- 1103: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_ascii</span>(<span class="ruby-identifier">label</span>)
134
- 1104: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">label</span>.<span class="ruby-identifier">nil?</span>
135
- 1105: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">use_libidn?</span>
136
- 1106: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">IDN</span><span class="ruby-operator">::</span><span class="ruby-constant">Idna</span>.<span class="ruby-identifier">toASCII</span>(<span class="ruby-identifier">label</span>)
137
- 1107: <span class="ruby-keyword kw">else</span>
138
- 1108: <span class="ruby-identifier">raise</span> <span class="ruby-constant">NotImplementedError</span>,
139
- 1109: <span class="ruby-value str">&quot;There is no available pure-ruby implementation. &quot;</span> <span class="ruby-operator">+</span>
140
- 1110: <span class="ruby-value str">&quot;Install libidn bindings.&quot;</span>
141
- 1111: <span class="ruby-keyword kw">end</span>
142
- 1112: <span class="ruby-keyword kw">end</span>
132
+ <span class="ruby-comment cmt"># File lib/addressable/uri.rb, line 1114</span>
133
+ 1114: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_ascii</span>(<span class="ruby-identifier">label</span>)
134
+ 1115: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">label</span>.<span class="ruby-identifier">nil?</span>
135
+ 1116: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">use_libidn?</span>
136
+ 1117: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">IDN</span><span class="ruby-operator">::</span><span class="ruby-constant">Idna</span>.<span class="ruby-identifier">toASCII</span>(<span class="ruby-identifier">label</span>)
137
+ 1118: <span class="ruby-keyword kw">else</span>
138
+ 1119: <span class="ruby-identifier">raise</span> <span class="ruby-constant">NotImplementedError</span>,
139
+ 1120: <span class="ruby-value str">&quot;There is no available pure-ruby implementation. &quot;</span> <span class="ruby-operator">+</span>
140
+ 1121: <span class="ruby-value str">&quot;Install libidn bindings.&quot;</span>
141
+ 1122: <span class="ruby-keyword kw">end</span>
142
+ 1123: <span class="ruby-keyword kw">end</span>
143
143
  </pre>
144
144
  </div>
145
145
  </div>
146
146
  </div>
147
147
 
148
- <div id="method-M000058" class="method-detail">
149
- <a name="M000058"></a>
148
+ <div id="method-M000059" class="method-detail">
149
+ <a name="M000059"></a>
150
150
 
151
151
  <div class="method-heading">
152
- <a href="#M000058" class="method-signature">
152
+ <a href="#M000059" class="method-signature">
153
153
  <span class="method-name">to_unicode</span><span class="method-args">(label)</span>
154
154
  </a>
155
155
  </div>
@@ -159,20 +159,20 @@ Returns the ascii representation of the label.
159
159
  Returns the unicode representation of the label.
160
160
  </p>
161
161
  <p><a class="source-toggle" href="#"
162
- onclick="toggleCode('M000058-source');return false;">[Source]</a></p>
163
- <div class="method-source-code" id="M000058-source">
162
+ onclick="toggleCode('M000059-source');return false;">[Source]</a></p>
163
+ <div class="method-source-code" id="M000059-source">
164
164
  <pre>
165
- <span class="ruby-comment cmt"># File lib/addressable/uri.rb, line 1115</span>
166
- 1115: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_unicode</span>(<span class="ruby-identifier">label</span>)
167
- 1116: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">label</span>.<span class="ruby-identifier">nil?</span>
168
- 1117: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">use_libidn?</span>
169
- 1118: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">IDN</span><span class="ruby-operator">::</span><span class="ruby-constant">Idna</span>.<span class="ruby-identifier">toUnicode</span>(<span class="ruby-identifier">label</span>)
170
- 1119: <span class="ruby-keyword kw">else</span>
171
- 1120: <span class="ruby-identifier">raise</span> <span class="ruby-constant">NotImplementedError</span>,
172
- 1121: <span class="ruby-value str">&quot;There is no available pure-ruby implementation. &quot;</span> <span class="ruby-operator">+</span>
173
- 1122: <span class="ruby-value str">&quot;Install libidn bindings.&quot;</span>
174
- 1123: <span class="ruby-keyword kw">end</span>
175
- 1124: <span class="ruby-keyword kw">end</span>
165
+ <span class="ruby-comment cmt"># File lib/addressable/uri.rb, line 1126</span>
166
+ 1126: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_unicode</span>(<span class="ruby-identifier">label</span>)
167
+ 1127: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">label</span>.<span class="ruby-identifier">nil?</span>
168
+ 1128: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">use_libidn?</span>
169
+ 1129: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">IDN</span><span class="ruby-operator">::</span><span class="ruby-constant">Idna</span>.<span class="ruby-identifier">toUnicode</span>(<span class="ruby-identifier">label</span>)
170
+ 1130: <span class="ruby-keyword kw">else</span>
171
+ 1131: <span class="ruby-identifier">raise</span> <span class="ruby-constant">NotImplementedError</span>,
172
+ 1132: <span class="ruby-value str">&quot;There is no available pure-ruby implementation. &quot;</span> <span class="ruby-operator">+</span>
173
+ 1133: <span class="ruby-value str">&quot;Install libidn bindings.&quot;</span>
174
+ 1134: <span class="ruby-keyword kw">end</span>
175
+ 1135: <span class="ruby-keyword kw">end</span>
176
176
  </pre>
177
177
  </div>
178
178
  </div>
@@ -1 +1 @@
1
- Sun Oct 28 17:23:21 -0400 2007
1
+ Sat Nov 03 22:20:27 -0400 2007
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sun Oct 28 15:46:06 -0400 2007</td>
59
+ <td>Sat Nov 03 19:31:11 -0400 2007</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -69,7 +69,17 @@
69
69
  <div id="contextContent">
70
70
 
71
71
  <div id="description">
72
- <h3><a href="../classes/Addressable.html">Addressable</a> 0.1.2</h3>
72
+ <h3><a href="../classes/Addressable.html">Addressable</a> 1.0.0</h3>
73
+ <pre>
74
+ * heuristic parse method added
75
+ * parsing is slightly more strict
76
+ * replaced to_h with to_hash
77
+ * fixed routing methods
78
+ * improved specifications
79
+ * improved heckle rake task
80
+ * no surviving heckle mutations
81
+ </pre>
82
+ <h3><a href="../classes/Addressable.html">Addressable</a> 0.1.2</h3>
73
83
  <pre>
74
84
  * improved normalization
75
85
  * fixed bug in joining algorithm
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sun Oct 28 17:15:18 -0400 2007</td>
59
+ <td>Sat Nov 03 20:48:16 -0400 2007</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Wed Sep 05 19:02:53 -0400 2007</td>
59
+ <td>Fri Nov 02 10:59:09 -0400 2007</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -20,64 +20,65 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/Addressable/URI.html#M000040">+ (Addressable::URI)</a><br />
24
- <a href="classes/Addressable/URI.html#M000051">== (Addressable::URI)</a><br />
25
- <a href="classes/Addressable/URI.html#M000050">=== (Addressable::URI)</a><br />
26
- <a href="classes/Addressable/URI.html#M000039">absolute? (Addressable::URI)</a><br />
27
- <a href="classes/Addressable/URI.html#M000022">authority (Addressable::URI)</a><br />
28
- <a href="classes/Addressable/URI.html#M000023">authority= (Addressable::URI)</a><br />
29
- <a href="classes/Addressable/URI.html#M000031">basename (Addressable::URI)</a><br />
30
- <a href="classes/Addressable/URI.html#M000002">convert_path (Addressable::URI)</a><br />
31
- <a href="classes/Addressable/URI.html#M000049">display_uri (Addressable::URI)</a><br />
32
- <a href="classes/Addressable/URI.html#M000053">dup (Addressable::URI)</a><br />
33
- <a href="classes/Addressable/URI.html#M000008">encode (Addressable::URI)</a><br />
34
- <a href="classes/Addressable/URI.html#M000006">encode_segment (Addressable::URI)</a><br />
35
- <a href="classes/Addressable/URI.html#M000052">eql? (Addressable::URI)</a><br />
36
- <a href="classes/Addressable/URI.html#M000003">expand_template (Addressable::URI)</a><br />
37
- <a href="classes/Addressable/URI.html#M000032">extname (Addressable::URI)</a><br />
38
- <a href="classes/Addressable/URI.html#M000010">extract (Addressable::URI)</a><br />
39
- <a href="classes/Addressable/URI.html#M000004">extract_mapping (Addressable::URI)</a><br />
40
- <a href="classes/Addressable/URI.html#M000035">fragment (Addressable::URI)</a><br />
41
- <a href="classes/Addressable/URI.html#M000036">fragment= (Addressable::URI)</a><br />
42
- <a href="classes/Addressable/URI.html#M000020">host (Addressable::URI)</a><br />
43
- <a href="classes/Addressable/URI.html#M000021">host= (Addressable::URI)</a><br />
44
- <a href="classes/Addressable/URI.html#M000056">inspect (Addressable::URI)</a><br />
45
- <a href="classes/Addressable/URI.html#M000037">ip_based? (Addressable::URI)</a><br />
46
- <a href="classes/Addressable/URI.html#M000024">ip_based_schemes (Addressable::URI)</a><br />
47
- <a href="classes/Addressable/URI.html#M000005">join (Addressable::URI)</a><br />
48
- <a href="classes/Addressable/URI.html#M000042">join (Addressable::URI)</a><br />
49
- <a href="classes/Addressable/URI.html#M000044">join! (Addressable::URI)</a><br />
50
- <a href="classes/Addressable/URI.html#M000041">merge (Addressable::URI)</a><br />
51
- <a href="classes/Addressable/URI.html#M000043">merge! (Addressable::URI)</a><br />
52
- <a href="classes/Addressable/URI.html#M000011">new (Addressable::URI)</a><br />
53
- <a href="classes/Addressable/URI.html#M000047">normalize (Addressable::URI)</a><br />
54
- <a href="classes/Addressable/URI.html#M000048">normalize! (Addressable::URI)</a><br />
55
- <a href="classes/Addressable/URI.html#M000009">normalized_encode (Addressable::URI)</a><br />
23
+ <a href="classes/Addressable/URI.html#M000041">+ (Addressable::URI)</a><br />
24
+ <a href="classes/Addressable/URI.html#M000052">== (Addressable::URI)</a><br />
25
+ <a href="classes/Addressable/URI.html#M000051">=== (Addressable::URI)</a><br />
26
+ <a href="classes/Addressable/URI.html#M000040">absolute? (Addressable::URI)</a><br />
27
+ <a href="classes/Addressable/URI.html#M000023">authority (Addressable::URI)</a><br />
28
+ <a href="classes/Addressable/URI.html#M000024">authority= (Addressable::URI)</a><br />
29
+ <a href="classes/Addressable/URI.html#M000032">basename (Addressable::URI)</a><br />
30
+ <a href="classes/Addressable/URI.html#M000003">convert_path (Addressable::URI)</a><br />
31
+ <a href="classes/Addressable/URI.html#M000050">display_uri (Addressable::URI)</a><br />
32
+ <a href="classes/Addressable/URI.html#M000054">dup (Addressable::URI)</a><br />
33
+ <a href="classes/Addressable/URI.html#M000009">encode (Addressable::URI)</a><br />
34
+ <a href="classes/Addressable/URI.html#M000007">encode_segment (Addressable::URI)</a><br />
35
+ <a href="classes/Addressable/URI.html#M000053">eql? (Addressable::URI)</a><br />
36
+ <a href="classes/Addressable/URI.html#M000004">expand_template (Addressable::URI)</a><br />
37
+ <a href="classes/Addressable/URI.html#M000033">extname (Addressable::URI)</a><br />
38
+ <a href="classes/Addressable/URI.html#M000011">extract (Addressable::URI)</a><br />
39
+ <a href="classes/Addressable/URI.html#M000005">extract_mapping (Addressable::URI)</a><br />
40
+ <a href="classes/Addressable/URI.html#M000036">fragment (Addressable::URI)</a><br />
41
+ <a href="classes/Addressable/URI.html#M000037">fragment= (Addressable::URI)</a><br />
42
+ <a href="classes/Addressable/URI.html#M000002">heuristic_parse (Addressable::URI)</a><br />
43
+ <a href="classes/Addressable/URI.html#M000021">host (Addressable::URI)</a><br />
44
+ <a href="classes/Addressable/URI.html#M000022">host= (Addressable::URI)</a><br />
45
+ <a href="classes/Addressable/URI.html#M000057">inspect (Addressable::URI)</a><br />
46
+ <a href="classes/Addressable/URI.html#M000038">ip_based? (Addressable::URI)</a><br />
47
+ <a href="classes/Addressable/URI.html#M000025">ip_based_schemes (Addressable::URI)</a><br />
48
+ <a href="classes/Addressable/URI.html#M000043">join (Addressable::URI)</a><br />
49
+ <a href="classes/Addressable/URI.html#M000006">join (Addressable::URI)</a><br />
50
+ <a href="classes/Addressable/URI.html#M000045">join! (Addressable::URI)</a><br />
51
+ <a href="classes/Addressable/URI.html#M000042">merge (Addressable::URI)</a><br />
52
+ <a href="classes/Addressable/URI.html#M000044">merge! (Addressable::URI)</a><br />
53
+ <a href="classes/Addressable/URI.html#M000012">new (Addressable::URI)</a><br />
54
+ <a href="classes/Addressable/URI.html#M000048">normalize (Addressable::URI)</a><br />
55
+ <a href="classes/Addressable/URI.html#M000049">normalize! (Addressable::URI)</a><br />
56
+ <a href="classes/Addressable/URI.html#M000010">normalized_encode (Addressable::URI)</a><br />
56
57
  <a href="classes/Addressable/URI.html#M000001">parse (Addressable::URI)</a><br />
57
- <a href="classes/Addressable/URI.html#M000016">password (Addressable::URI)</a><br />
58
- <a href="classes/Addressable/URI.html#M000017">password= (Addressable::URI)</a><br />
59
- <a href="classes/Addressable/URI.html#M000029">path (Addressable::URI)</a><br />
60
- <a href="classes/Addressable/URI.html#M000030">path= (Addressable::URI)</a><br />
61
- <a href="classes/Addressable/URI.html#M000026">port (Addressable::URI)</a><br />
62
- <a href="classes/Addressable/URI.html#M000027">port= (Addressable::URI)</a><br />
63
- <a href="classes/Addressable/URI.html#M000033">query (Addressable::URI)</a><br />
64
- <a href="classes/Addressable/URI.html#M000034">query= (Addressable::URI)</a><br />
65
- <a href="classes/Addressable/URI.html#M000038">relative? (Addressable::URI)</a><br />
66
- <a href="classes/Addressable/URI.html#M000045">route_from (Addressable::URI)</a><br />
67
- <a href="classes/Addressable/URI.html#M000046">route_to (Addressable::URI)</a><br />
68
- <a href="classes/Addressable/URI.html#M000012">scheme (Addressable::URI)</a><br />
69
- <a href="classes/Addressable/URI.html#M000013">scheme= (Addressable::URI)</a><br />
70
- <a href="classes/Addressable/URI.html#M000025">scheme_mapping (Addressable::URI)</a><br />
71
- <a href="classes/Addressable/URI.html#M000028">specified_port (Addressable::URI)</a><br />
72
- <a href="classes/Addressable/URI/IDNA.html#M000057">to_ascii (Addressable::URI::IDNA)</a><br />
73
- <a href="classes/Addressable/URI.html#M000055">to_h (Addressable::URI)</a><br />
74
- <a href="classes/Addressable/URI.html#M000054">to_s (Addressable::URI)</a><br />
75
- <a href="classes/Addressable/URI/IDNA.html#M000058">to_unicode (Addressable::URI::IDNA)</a><br />
76
- <a href="classes/Addressable/URI.html#M000007">unencode_segment (Addressable::URI)</a><br />
77
- <a href="classes/Addressable/URI.html#M000014">user (Addressable::URI)</a><br />
78
- <a href="classes/Addressable/URI.html#M000015">user= (Addressable::URI)</a><br />
79
- <a href="classes/Addressable/URI.html#M000018">userinfo (Addressable::URI)</a><br />
80
- <a href="classes/Addressable/URI.html#M000019">userinfo= (Addressable::URI)</a><br />
58
+ <a href="classes/Addressable/URI.html#M000017">password (Addressable::URI)</a><br />
59
+ <a href="classes/Addressable/URI.html#M000018">password= (Addressable::URI)</a><br />
60
+ <a href="classes/Addressable/URI.html#M000030">path (Addressable::URI)</a><br />
61
+ <a href="classes/Addressable/URI.html#M000031">path= (Addressable::URI)</a><br />
62
+ <a href="classes/Addressable/URI.html#M000027">port (Addressable::URI)</a><br />
63
+ <a href="classes/Addressable/URI.html#M000028">port= (Addressable::URI)</a><br />
64
+ <a href="classes/Addressable/URI.html#M000034">query (Addressable::URI)</a><br />
65
+ <a href="classes/Addressable/URI.html#M000035">query= (Addressable::URI)</a><br />
66
+ <a href="classes/Addressable/URI.html#M000039">relative? (Addressable::URI)</a><br />
67
+ <a href="classes/Addressable/URI.html#M000046">route_from (Addressable::URI)</a><br />
68
+ <a href="classes/Addressable/URI.html#M000047">route_to (Addressable::URI)</a><br />
69
+ <a href="classes/Addressable/URI.html#M000013">scheme (Addressable::URI)</a><br />
70
+ <a href="classes/Addressable/URI.html#M000014">scheme= (Addressable::URI)</a><br />
71
+ <a href="classes/Addressable/URI.html#M000026">scheme_mapping (Addressable::URI)</a><br />
72
+ <a href="classes/Addressable/URI.html#M000029">specified_port (Addressable::URI)</a><br />
73
+ <a href="classes/Addressable/URI/IDNA.html#M000058">to_ascii (Addressable::URI::IDNA)</a><br />
74
+ <a href="classes/Addressable/URI.html#M000056">to_hash (Addressable::URI)</a><br />
75
+ <a href="classes/Addressable/URI.html#M000055">to_s (Addressable::URI)</a><br />
76
+ <a href="classes/Addressable/URI/IDNA.html#M000059">to_unicode (Addressable::URI::IDNA)</a><br />
77
+ <a href="classes/Addressable/URI.html#M000008">unencode_segment (Addressable::URI)</a><br />
78
+ <a href="classes/Addressable/URI.html#M000015">user (Addressable::URI)</a><br />
79
+ <a href="classes/Addressable/URI.html#M000016">user= (Addressable::URI)</a><br />
80
+ <a href="classes/Addressable/URI.html#M000019">userinfo (Addressable::URI)</a><br />
81
+ <a href="classes/Addressable/URI.html#M000020">userinfo= (Addressable::URI)</a><br />
81
82
  </div>
82
83
  </div>
83
84
  </body>
@@ -93,31 +93,51 @@ module Addressable
93
93
  host = authority.gsub(/^([^\[\]]*)@/, "").gsub(/:([^:@\[\]]*?)$/, "")
94
94
  port = authority.scan(/:([^:@\[\]]*?)$/).flatten[0]
95
95
  end
96
- if port.nil? || port == ""
96
+ if port == nil || port == ""
97
97
  port = nil
98
98
  end
99
99
 
100
- # WARNING: Not standards-compliant, but follows the theme
101
- # of Postel's law:
102
- #
103
- # Special exception for dealing with the retarded idea of the
104
- # feed pseudo-protocol. Without this exception, the parser will read
105
- # the URI as having a blank port number, instead of as having a second
106
- # URI embedded within. This exception translates these broken URIs
107
- # and instead treats the inner URI as opaque.
108
- if scheme == "feed" && host == "http"
109
- userinfo = nil
110
- user = nil
111
- password = nil
112
- host = nil
113
- port = nil
114
- path = authority + path
115
- end
116
-
117
100
  return Addressable::URI.new(
118
101
  scheme, user, password, host, port, path, query, fragment)
119
102
  end
120
103
 
104
+ # Converts an input to a URI. The input does not have to be a valid
105
+ # URI -- the method will use heuristics to guess what URI was intended.
106
+ # This is not standards compliant, merely user-friendly.
107
+ def self.heuristic_parse(input, hints={})
108
+ input = input.dup
109
+ hints = {
110
+ :scheme => "http"
111
+ }.merge(hints)
112
+ case input
113
+ when /^http:\/+/
114
+ input.gsub!(/^http:\/+/, "http://")
115
+ when /^feed:\/+http:\/+/
116
+ input.gsub!(/^feed:\/+http:\/+/, "feed:http://")
117
+ when /^feed:\/+/
118
+ input.gsub!(/^feed:\/+/, "feed://")
119
+ when /^file:\/+/
120
+ input.gsub!(/^file:\/+/, "file:///")
121
+ end
122
+ parsed = self.parse(input)
123
+ if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/
124
+ parsed = self.parse(hints[:scheme] + "://" + input)
125
+ end
126
+ if parsed.authority == nil
127
+ if parsed.path =~ /^[^\/]+\./
128
+ new_host = parsed.path.scan(/^([^\/]+\.[^\/]*)/).flatten[0]
129
+ if new_host
130
+ new_path = parsed.path.gsub(
131
+ Regexp.new("^" + Regexp.escape(new_host)), "")
132
+ parsed.host = new_host
133
+ parsed.path = new_path
134
+ parsed.scheme = hints[:scheme]
135
+ end
136
+ end
137
+ end
138
+ return parsed
139
+ end
140
+
121
141
  # Converts a path to a file protocol URI. If the path supplied is
122
142
  # relative, it will be returned as a relative URI. If the path supplied
123
143
  # is actually a URI, it will return the parsed URI.
@@ -458,15 +478,14 @@ module Addressable
458
478
  @password = password
459
479
  @host = host
460
480
  @specified_port = port.to_s
461
- @port = port
462
- @port = @port.to_s if @port.kind_of?(Fixnum)
481
+ @port = port.kind_of?(Fixnum) ? port.to_s : port
463
482
  if @port != nil && !(@port =~ /^\d+$/)
464
483
  raise InvalidURIError,
465
484
  "Invalid port number: #{@port.inspect}"
466
485
  end
467
486
  @port = @port.to_i
468
487
  @port = nil if @port == 0
469
- @path = path
488
+ @path = (path || "")
470
489
  @query = query
471
490
  @fragment = fragment
472
491
 
@@ -529,15 +548,15 @@ module Addressable
529
548
 
530
549
  # Returns the username and password segment of this URI.
531
550
  def userinfo
532
- if !defined?(@userinfo) || @userinfo.nil?
551
+ if !defined?(@userinfo) || @userinfo == nil
533
552
  current_user = self.user
534
553
  current_password = self.password
535
- if current_user == nil && current_password == nil
554
+ if !current_user && !current_password
536
555
  @userinfo = nil
537
- elsif current_user != nil && current_password == nil
538
- @userinfo = "#{current_user}"
539
- elsif current_user != nil && current_password != nil
556
+ elsif current_user && current_password
540
557
  @userinfo = "#{current_user}:#{current_password}"
558
+ elsif current_user && !current_password
559
+ @userinfo = "#{current_user}"
541
560
  end
542
561
  end
543
562
  return @userinfo
@@ -593,9 +612,9 @@ module Addressable
593
612
 
594
613
  # Sets the authority segment of this URI.
595
614
  def authority=(new_authority)
596
- if new_authority != nil
615
+ if new_authority
597
616
  new_userinfo = new_authority.scan(/^([^\[\]]*)@/).flatten[0]
598
- if new_userinfo != nil
617
+ if new_userinfo
599
618
  new_user = new_userinfo.strip.scan(/^([^:]*):?/).flatten[0]
600
619
  new_password = new_userinfo.strip.scan(/:(.*)$/).flatten[0]
601
620
  end
@@ -604,7 +623,6 @@ module Addressable
604
623
  new_port =
605
624
  new_authority.scan(/:([^:@\[\]]*?)$/).flatten[0]
606
625
  end
607
- new_port = nil if new_port == ""
608
626
 
609
627
  # Password assigned first to ensure validity in case of nil
610
628
  self.password = new_password
@@ -654,10 +672,10 @@ module Addressable
654
672
  # in the URI.
655
673
  def port
656
674
  if @port.to_i == 0
657
- if self.scheme.nil?
658
- @port = nil
659
- else
675
+ if self.scheme
660
676
  @port = self.class.scheme_mapping[self.scheme.strip.downcase]
677
+ else
678
+ @port = nil
661
679
  end
662
680
  return @port
663
681
  else
@@ -690,13 +708,13 @@ module Addressable
690
708
 
691
709
  # Sets the path for this URI.
692
710
  def path=(new_path)
693
- @path = new_path
711
+ @path = (new_path || "")
694
712
  end
695
713
 
696
714
  # Returns the basename, if any, of the file at the path being referenced.
697
715
  # Returns nil if there is no path component.
698
716
  def basename
699
- return nil if self.path == nil
717
+ # Path cannot be nil
700
718
  return File.basename(self.path).gsub(/;[^\/]*$/, "")
701
719
  end
702
720
 
@@ -704,8 +722,8 @@ module Addressable
704
722
  # Returns "" if there is no extension or nil if there is no path
705
723
  # component.
706
724
  def extname
707
- return nil if self.path == nil
708
- return File.extname(self.basename.gsub(/;[^\/]*$/, ""))
725
+ return nil unless self.path
726
+ return File.extname(self.basename)
709
727
  end
710
728
 
711
729
  # Returns the query string for this URI.
@@ -730,8 +748,11 @@ module Addressable
730
748
 
731
749
  # Returns true if the URI uses an IP-based protocol.
732
750
  def ip_based?
733
- return false if self.scheme.nil?
734
- return self.class.ip_based_schemes.include?(self.scheme.strip.downcase)
751
+ if self.scheme
752
+ return self.class.ip_based_schemes.include?(
753
+ self.scheme.strip.downcase)
754
+ end
755
+ return false
735
756
  end
736
757
 
737
758
  # Returns true if this URI is known to be relative.
@@ -851,19 +872,18 @@ module Addressable
851
872
  # supplied URI as a base for resolution. Returns an absolute URI if
852
873
  # necessary.
853
874
  def route_from(uri)
854
- uri = uri.kind_of?(self.class) ? uri : self.class.parse(uri.to_s)
855
- uri = uri.normalize
875
+ uri = self.class.parse(uri).normalize
856
876
  normalized_self = self.normalize
857
877
  if normalized_self.relative?
858
878
  raise ArgumentError, "Expected absolute URI, got: #{self.to_s}"
859
879
  end
860
880
  if uri.relative?
861
- raise ArgumentError, "Expected absolute URI, got: #{self.to_s}"
881
+ raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}"
862
882
  end
863
883
  if normalized_self == uri
864
884
  return Addressable::URI.parse("##{normalized_self.fragment}")
865
885
  end
866
- segments = normalized_self.to_h
886
+ segments = normalized_self.to_hash
867
887
  if normalized_self.scheme == uri.scheme
868
888
  segments[:scheme] = nil
869
889
  if normalized_self.authority == uri.authority
@@ -876,11 +896,16 @@ module Addressable
876
896
  if normalized_self.query == uri.query
877
897
  segments[:query] = nil
878
898
  end
899
+ else
900
+ if uri.path != "/"
901
+ segments[:path].gsub!(
902
+ Regexp.new("^" + Regexp.escape(uri.path)), "")
903
+ end
879
904
  end
880
905
  end
881
906
  end
882
907
  # Avoid network-path references.
883
- if segments[:scheme] == nil && segments[:host] != nil
908
+ if segments[:host] != nil
884
909
  segments[:scheme] = normalized_self.scheme
885
910
  end
886
911
  return Addressable::URI.new(
@@ -899,8 +924,7 @@ module Addressable
899
924
  # uses this URI as a base for resolution. Returns an absolute URI if
900
925
  # necessary.
901
926
  def route_to(uri)
902
- uri = uri.kind_of?(self.class) ? uri : self.class.parse(uri.to_s)
903
- return uri.route_from(self)
927
+ return self.class.parse(uri).route_from(self)
904
928
  end
905
929
 
906
930
  # Returns a normalized URI object.
@@ -925,8 +949,10 @@ module Addressable
925
949
  normalized_password = nil
926
950
  normalized_password = self.password.strip if self.password != nil
927
951
 
952
+ # If we are using http or https and user/password are blank,
953
+ # then we remove them
928
954
  if normalized_scheme =~ /https?/ && normalized_user == "" &&
929
- (normalized_password == nil || normalized_password == "")
955
+ (!normalized_password || normalized_password == "")
930
956
  normalized_user = nil
931
957
  normalized_password = nil
932
958
  end
@@ -943,18 +969,13 @@ module Addressable
943
969
  normalized_host = normalized_host[0...-1]
944
970
  end
945
971
  end
946
-
972
+
947
973
  normalized_port = self.port
948
974
  if self.class.scheme_mapping[normalized_scheme] == normalized_port
949
975
  normalized_port = nil
950
976
  end
951
977
  normalized_path = nil
952
978
  normalized_path = self.path.strip if self.path != nil
953
- if normalized_path == nil &&
954
- normalized_scheme != nil &&
955
- normalized_host != nil
956
- normalized_path = "/"
957
- end
958
979
  if normalized_path != nil
959
980
  normalized_path = self.class.normalize_path(normalized_path)
960
981
  end
@@ -1005,13 +1026,12 @@ module Addressable
1005
1026
  # both URIs before doing the comparison, and allows comparison against
1006
1027
  # strings.
1007
1028
  def ===(uri)
1008
- uri_string = nil
1009
1029
  if uri.respond_to?(:normalize)
1010
1030
  uri_string = uri.normalize.to_s
1011
1031
  else
1012
1032
  begin
1013
1033
  uri_string = URI.parse(uri.to_s).normalize.to_s
1014
- rescue Exception
1034
+ rescue InvalidURIError
1015
1035
  return false
1016
1036
  end
1017
1037
  end
@@ -1034,21 +1054,14 @@ module Addressable
1034
1054
 
1035
1055
  # Clones the URI object.
1036
1056
  def dup
1037
- duplicated_scheme = nil
1038
- duplicated_scheme = self.scheme.dup if self.scheme != nil
1039
- duplicated_user = nil
1040
- duplicated_user = self.user.dup if self.user != nil
1041
- duplicated_password = nil
1042
- duplicated_password = self.password.dup if self.password != nil
1043
- duplicated_host = nil
1044
- duplicated_host = self.host.dup if self.host != nil
1045
- duplicated_port = self.port
1046
- duplicated_path = nil
1047
- duplicated_path = self.path.dup if self.path != nil
1048
- duplicated_query = nil
1049
- duplicated_query = self.query.dup if self.query != nil
1050
- duplicated_fragment = nil
1051
- duplicated_fragment = self.fragment.dup if self.fragment != nil
1057
+ duplicated_scheme = self.scheme ? self.scheme.dup : nil
1058
+ duplicated_user = self.user ? self.user.dup : nil
1059
+ duplicated_password = self.password ? self.password.dup : nil
1060
+ duplicated_host = self.host ? self.host.dup : nil
1061
+ duplicated_port = self.specified_port
1062
+ duplicated_path = self.path ? self.path.dup : nil
1063
+ duplicated_query = self.query ? self.query.dup : nil
1064
+ duplicated_fragment = self.fragment ? self.fragment.dup : nil
1052
1065
  duplicated_uri = Addressable::URI.new(
1053
1066
  duplicated_scheme,
1054
1067
  duplicated_user,
@@ -1059,8 +1072,6 @@ module Addressable
1059
1072
  duplicated_query,
1060
1073
  duplicated_fragment
1061
1074
  )
1062
- @specified_port = nil if !defined?(@specified_port)
1063
- duplicated_uri.instance_variable_set("@specified_port", @specified_port)
1064
1075
  return duplicated_uri
1065
1076
  end
1066
1077
 
@@ -1076,7 +1087,7 @@ module Addressable
1076
1087
  end
1077
1088
 
1078
1089
  # Returns a Hash of the URI segments.
1079
- def to_h
1090
+ def to_hash
1080
1091
  return {
1081
1092
  :scheme => self.scheme,
1082
1093
  :user => self.user,
@@ -1171,17 +1182,19 @@ module Addressable
1171
1182
 
1172
1183
  # Ensures that the URI is valid.
1173
1184
  def validate
1174
- if self.scheme == nil && self.user == nil && self.password == nil &&
1175
- self.host == nil && self.port == nil && self.path == nil &&
1176
- self.query == nil && self.fragment == nil
1177
- raise InvalidURIError, "All segments were nil."
1178
- end
1179
1185
  if self.scheme != nil &&
1180
1186
  (self.host == nil || self.host == "") &&
1181
1187
  (self.path == nil || self.path == "")
1182
1188
  raise InvalidURIError,
1183
1189
  "Absolute URI missing hierarchical segment."
1184
1190
  end
1191
+ if self.host == nil
1192
+ if self.specified_port != nil ||
1193
+ self.user != nil ||
1194
+ self.password != nil
1195
+ raise InvalidURIError, "Hostname not supplied."
1196
+ end
1197
+ end
1185
1198
  end
1186
1199
 
1187
1200
  # Replaces the internal state of self with the specified URI's state.