lib/brakeman/file_path.rb
require 'pathname' module Brakeman # Class to represent file paths within Brakeman. # FilePath objects track both the relative and absolute paths # to make it easier to manage paths. class FilePath attr_reader :absolute, :relative @cache = {} # Create a new FilePath using an AppTree object. # # Note that if the path is already a FilePath, that path will # be returned unaltered. # # Additionally, paths are cached. If the absolute path already has # a FilePath in the cache, that existing FilePath will be returned. def self.from_app_tree app_tree, path return path if path.is_a? Brakeman::FilePath absolute = app_tree.expand_path(path).freeze if fp = @cache[absolute] return fp end relative = app_tree.relative_path(path).freeze self.new(absolute, relative).tap { |fp| @cache[absolute] = fp } end # Create a new FilePath with the given absolute and relative paths. def initialize absolute_path, relative_path @absolute = absolute_path @relative = relative_path end # Just the file name, no path def basename @basename ||= File.basename(self.relative) end # Read file from absolute path. def read File.read self.absolute end # Check if absolute path exists. def exists? File.exist? self.absolute end # Compare FilePaths. Raises an ArgumentError unless both objects are FilePaths. def <=> rhs raise ArgumentError unless rhs.is_a? Brakeman::FilePath self.relative <=> rhs.relative end # Compare FilePaths. Raises an ArgumentError unless both objects are FilePaths. def == rhs return false unless rhs.is_a? Brakeman::FilePath self.absolute == rhs.absolute end # Returns a string with the absolute path. def to_str self.absolute end # Returns a string with the absolute path. def to_s self.to_str end def hash @hash ||= [@absolute, @relative].hash end def eql? rhs @absolute == rhs.absolute and @relative == rhs.relative end end end