module Nanoc3

class Path

def initialize(str)
@orig_str = str
end

def components
@components ||= @orig_str.gsub(/^\/+|\/+$/, '').split('/')
end

def to_s
@clean_str ||= ('/' + components.join('/') + '/')
end

def inspect
"<#{self.class}:0x#{self.object_id.to_s(16)} str=#{self.to_s}>"
end

def <=>(other)
self.to_s <=> other.to_s
end

def ==(other)
(self.to_s <=> other.to_s) == 0
end

def eql?(other)
self.class == other.class && self == other
end

def hash
[ self.class, self.to_s ].hash
end

def =~(str)
self == Nanoc3::Path.new(str)
end

end

end

puts '*** These should all be /foo/bar/:'
puts Nanoc3::Path.new('/foo/bar/')
puts Nanoc3::Path.new('/foo/bar')
puts Nanoc3::Path.new('foo/bar/')
puts Nanoc3::Path.new('foo/bar')
puts Nanoc3::Path.new('////foo/bar////')
puts

puts '*** These should all be true (Path-Path comparison):'
puts Nanoc3::Path.new('/foo/bar/') == Nanoc3::Path.new('/foo/bar')
puts Nanoc3::Path.new('foo/bar/') == Nanoc3::Path.new('/foo/bar/')
puts

puts '*** These should all be true (Path-String comparison using ==):'
puts Nanoc3::Path.new('/foo/bar/') == '/foo/bar/'
puts

puts '*** These should all be false (Path-String comparison using ==):'
puts Nanoc3::Path.new('/foo/bar/') == 'foo/bar/'
puts Nanoc3::Path.new('/foo/bar/') == '/foo/bar'
puts

puts '*** These should all be true (Path-String comparison using =~):'
puts Nanoc3::Path.new('/foo/bar/') =~ '/foo/bar/'
puts Nanoc3::Path.new('/foo/bar/') =~ '/foo/bar'
puts