class PathSpec

Main PathSpec class, provides interfaces to various spec implementations

Attributes

specs[R]

Public Class Methods

from_filename(filename, type = :git) click to toggle source

Generate specs from a filename, such as a .gitignore

# File lib/pathspec.rb, line 70
def self.from_filename(filename, type = :git)
  File.open(filename, 'r') { |io| from_lines(io, type) }
end
from_lines(lines, type = :git) click to toggle source
# File lib/pathspec.rb, line 74
def self.from_lines(lines, type = :git)
  new lines, type
end
new(lines = nil, type = :git) click to toggle source
# File lib/pathspec.rb, line 10
def initialize(lines = nil, type = :git)
  @specs = []

  add(lines, type) if lines

  self
end

Public Instance Methods

add(obj, type = :git) click to toggle source

Generate specs from lines of text

# File lib/pathspec.rb, line 79
def add(obj, type = :git)
  spec_class = spec_type(type)

  if obj.respond_to?(:each_line)
    obj.each_line do |l|
      spec = spec_class.new(l.rstrip)

      @specs << spec if !spec.regex.nil? && !spec.inclusive?.nil?
    end
  elsif obj.respond_to?(:each)
    obj.each do |l|
      add(l, type)
    end
  else
    raise 'Cannot make Pathspec from non-string/non-enumerable object.'
  end

  self
end
drive_letter_to_path(path) click to toggle source
# File lib/pathspec.rb, line 65
def drive_letter_to_path(path)
  path.gsub(%r{^([a-zA-Z]):\/}, '/\1/')
end
empty?() click to toggle source
# File lib/pathspec.rb, line 99
def empty?
  @specs.empty?
end
match(path) click to toggle source

Check if a path matches the pathspecs described Returns true if there are matches and none are excluded Returns false if there aren’t matches or none are included

# File lib/pathspec.rb, line 21
def match(path)
  matches = specs_matching(path.to_s)
  !matches.empty? && matches.all? {|m| m.inclusive?}
end
match_path(path, root = '/') click to toggle source
# File lib/pathspec.rb, line 47
def match_path(path, root = '/')
  rootpath = Pathname.new(drive_letter_to_path(root))
  relpath = Pathname.new(drive_letter_to_path(path)).relative_path_from(rootpath).to_s
  relpath += '/' if path[-1].chr == '/'

  match(relpath)
end
match_paths(paths, root = '/') click to toggle source
# File lib/pathspec.rb, line 55
def match_paths(paths, root = '/')
  matching = []

  paths.each do |path|
    matching << path if match_path(path, root)
  end

  matching
end
match_tree(root) click to toggle source

Check if any files in a given directory or subdirectories match the specs Returns matched paths or nil if no paths matched

# File lib/pathspec.rb, line 34
def match_tree(root)
  rootpath = Pathname.new(root)
  matching = []

  Find.find(root) do |path|
    relpath = Pathname.new(path).relative_path_from(rootpath).to_s
    relpath += '/' if File.directory? path
    matching << path if match(relpath)
  end

  matching
end
spec_type(type) click to toggle source
# File lib/pathspec.rb, line 103
def spec_type(type)
  if type == :git
    GitIgnoreSpec
  elsif type == :regex
    RegexSpec
  else
    raise "Unknown spec type #{type}"
  end
end
specs_matching(path) click to toggle source
# File lib/pathspec.rb, line 26
def specs_matching(path)
  @specs.select do |spec|
    spec if spec.match(path)
  end
end