1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
require 'addressable/uri'
module DataObjects
# A DataObjects URI is of the form scheme://user:password@host:port/path#fragment
#
# The elements are all optional except scheme and path:
# scheme:: The name of a DBMS for which you have a do_\<scheme\> adapter gem installed. If scheme is *jdbc*, the actual DBMS is in the _path_ followed by a colon.
# user:: The name of the user to authenticate to the database
# password:: The password to use in authentication
# host:: The domain name (defaulting to localhost) where the database is available
# port:: The TCP/IP port number to use for the connection
# path:: The name or path to the database
# query:: Parameters for the connection, for example encoding=utf8
# fragment:: Not currently known to be in use, but available to the adapters
class URI
attr_reader :scheme, :subscheme, :user, :password, :host, :port, :path, :query, :fragment
# Make a DataObjects::URI object by parsing a string. Simply delegates to Addressable::URI::parse.
def self.parse(uri)
return uri if uri.kind_of?(self)
if uri.kind_of?(Addressable::URI)
scheme = uri.scheme
else
if uri[0,4] == 'jdbc'
scheme = uri[0,4]
uri = Addressable::URI::parse(uri[5, uri.length])
subscheme = uri.scheme
else
uri = Addressable::URI::parse(uri)
scheme = uri.scheme
subscheme = nil
end
end
self.new(
:scheme => scheme,
:subscheme => subscheme,
:user => uri.user,
:password => uri.password,
:host => uri.host,
:port => uri.port,
:path => uri.path,
:query => uri.query_values,
:fragment => uri.fragment,
:relative => !!uri.to_s.index('//') # basic (naive) check for relativity / opaqueness
)
end
def initialize(*args)
if (component = args.first).kind_of?(Hash)
@scheme = component[:scheme]
@subscheme = component[:subscheme]
@user = component[:user]
@password = component[:password]
@host = component[:host]
@port = component[:port]
@path = component[:path]
@query = component[:query]
@fragment = component[:fragment]
@relative = component[:relative]
elsif args.size > 1
warn "DataObjects::URI.new with arguments is deprecated, use a Hash of URI components (#{caller.first})"
@scheme, @user, @password, @host, @port, @path, @query, @fragment = *args
else
raise ArgumentError, "argument should be a Hash of URI components, was: #{args.inspect}"
end
end
def opaque?
!@relative
end
def relative?
@relative
end
# Display this URI object as a string
def to_s
string = ""
string << "#{scheme}:" if scheme
string << "#{subscheme}:" if subscheme
string << '//' if relative?
if user
string << "#{user}"
string << "@"
end
string << "#{host}" if host
string << ":#{port}" if port
string << path.to_s
if query
string << "?" << query.map do |key, value|
"#{key}=#{value}"
end.join("&")
end
string << "##{fragment}" if fragment
string
end
# Compare this URI to another for hashing
def eql?(other)
to_s.eql?(other.to_s)
end
# Hash this URI
def hash
to_s.hash
end
end
end
|