diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb
index 140fb055de..16cc8885bb 100644
--- a/lib/uri/generic.rb
+++ b/lib/uri/generic.rb
@@ -946,7 +946,25 @@ module URI
end
#
- # Checks if URI has a path
+ # Returns true if URI is hierarchical
+ #
+ # == Description
+ #
+ # URI has components listed in order of decreashing signficance from left to right
+ # see RFC3986 https://tools.ietf.org/html/rfc3986 1.2.3
+ #
+ # == Usage
+ #
+ # require 'uri'
+ #
+ # uri = URI.parse("http://my.example.com/")
+ # => #
+ # uri.hierarchical?
+ # # => true
+ # uri = URI.parse("mailto:joe@example.com")
+ # => #
+ # uri.hierarchical?
+ # # => false
#
def hierarchical?
if @path
@@ -957,7 +975,7 @@ module URI
end
#
- # Checks if URI is an absolute one
+ # Returns true if URI has a scheme (e.g. http:// or https://) specified
#
def absolute?
if @scheme
@@ -969,7 +987,7 @@ module URI
alias absolute absolute?
#
- # Checks if URI is relative
+ # Returns true if URI does not have a scheme (e.g. http:// or https://) specified
#
def relative?
!absolute?
diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb
index 7e428aa849..31aa5c7552 100644
--- a/test/uri/test_generic.rb
+++ b/test/uri/test_generic.rb
@@ -774,6 +774,24 @@ class URI::TestGeneric < Test::Unit::TestCase
assert_equal 'http://example', uri.to_s
end
+ def test_hierarchical
+ hierarchical = URI.parse('http://a.b.c/example')
+ opaque = URI.parse('mailto:mduerst@ifi.unizh.ch')
+
+ assert hierarchical.hierarchical?
+ refute opaque.hierarchical?
+ end
+
+ def test_absolute
+ abs_uri = URI.parse('http://a.b.c/')
+ not_abs = URI.parse('a.b.c')
+
+ refute not_abs.absolute?
+
+ assert abs_uri.absolute
+ assert abs_uri.absolute?
+ end
+
def test_ipv6
assert_equal("[::1]", URI("http://[::1]/bar/baz").host)
assert_equal("::1", URI("http://[::1]/bar/baz").hostname)