58 lines
1.4 KiB
Ruby
58 lines
1.4 KiB
Ruby
class Pathname
|
|
|
|
# Glob pathnames.
|
|
def glob(match, *opts)
|
|
flags = glob_flags(opts)
|
|
Dir.glob(::File.join(self.to_s, match), flags).collect{ |m| self.class.new(m) }
|
|
end
|
|
|
|
# Return the first glob match.
|
|
#
|
|
# DEPRECATE: While slightly faster then glob().first, not really worth it
|
|
# unless this can be rewritten to shortcut on first match (using fnmatch?).
|
|
# In wich case, is there a better name for this method?
|
|
def glob_first(match, *opts)
|
|
flags = glob_flags(opts)
|
|
file = ::Dir.glob(::File.join(self.to_s, match), flags).first
|
|
file ? self.class.new(file) : nil
|
|
end
|
|
|
|
# Return globbed matches with pathnames relative to the current pathname.
|
|
def glob_relative(match, *opts)
|
|
flags = glob_flags(opts)
|
|
files = Dir.glob(::File.join(self.to_s, match), flags)
|
|
files = files.map{ |f| f.sub(self.to_s.chomp('/') + '/', '') }
|
|
files.collect{ |m| self.class.new(m) }
|
|
end
|
|
|
|
# Does a directory contain a matching entry?
|
|
# Or if the pathname is a file, same as #fnmatch.
|
|
#
|
|
# TODO: Move to own file? Better name?
|
|
#
|
|
# Returns [Pathname]
|
|
|
|
def include?(pattern,*opts)
|
|
if directory?
|
|
glob_first(pattern,*opts)
|
|
else
|
|
fnmatch(pattern,*opts)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def glob_flags(opts)
|
|
flags = 0
|
|
opts.each do |opt|
|
|
case opt when Symbol, String
|
|
flags += ::File.const_get("FNM_#{opt}".upcase)
|
|
else
|
|
flags += opt
|
|
end
|
|
end
|
|
flags
|
|
end
|
|
|
|
end
|