Add PATH
class.
This commit is contained in:
parent
e221d0481a
commit
a16746906d
61
Library/Homebrew/PATH.rb
Normal file
61
Library/Homebrew/PATH.rb
Normal file
@ -0,0 +1,61 @@
|
||||
class PATH
|
||||
def initialize(*paths)
|
||||
@paths = parse(*paths)
|
||||
end
|
||||
|
||||
def prepend(*paths)
|
||||
@paths.unshift(*parse(*paths))
|
||||
self
|
||||
end
|
||||
|
||||
def append(*paths)
|
||||
@paths.concat(parse(*paths))
|
||||
self
|
||||
end
|
||||
|
||||
def to_ary
|
||||
@paths
|
||||
end
|
||||
alias to_a to_ary
|
||||
|
||||
def to_str
|
||||
@paths.join(File::PATH_SEPARATOR)
|
||||
end
|
||||
alias to_s to_str
|
||||
|
||||
def eql?(other)
|
||||
if other.respond_to?(:to_ary)
|
||||
return true if to_ary == other.to_ary
|
||||
end
|
||||
|
||||
if other.respond_to?(:to_str)
|
||||
return true if to_str == other.to_str
|
||||
end
|
||||
|
||||
false
|
||||
end
|
||||
alias == eql?
|
||||
|
||||
def empty?
|
||||
@paths.empty?
|
||||
end
|
||||
|
||||
def inspect
|
||||
"<PATH##{to_str}>"
|
||||
end
|
||||
|
||||
def validate
|
||||
self.class.new(@paths.select(&File.method(:directory?)))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse(*paths)
|
||||
paths
|
||||
.flatten
|
||||
.flat_map { |p| p.respond_to?(:to_str) ? p.to_str.split(File::PATH_SEPARATOR): p }
|
||||
.compact
|
||||
.map { |p| p.respond_to?(:to_path) ? p.to_path : p.to_str }
|
||||
.uniq
|
||||
end
|
||||
end
|
@ -3,6 +3,7 @@ require "extend/fileutils"
|
||||
require "extend/pathname"
|
||||
require "extend/git_repository"
|
||||
require "extend/ARGV"
|
||||
require "PATH"
|
||||
require "extend/string"
|
||||
require "os"
|
||||
require "utils"
|
||||
|
52
Library/Homebrew/test/PATH_spec.rb
Normal file
52
Library/Homebrew/test/PATH_spec.rb
Normal file
@ -0,0 +1,52 @@
|
||||
require "PATH"
|
||||
|
||||
describe PATH do
|
||||
describe "#initialize" do
|
||||
it "can take multiple arguments" do
|
||||
expect(described_class.new("/path1", "/path2")).to eq("/path1:/path2")
|
||||
end
|
||||
|
||||
it "can parse a mix of arrays and arguments" do
|
||||
expect(described_class.new(["/path1", "/path2"], "/path3")).to eq("/path1:/path2:/path3")
|
||||
end
|
||||
|
||||
it "splits an existing PATH" do
|
||||
expect(described_class.new("/path1:/path2")).to eq(["/path1", "/path2"])
|
||||
end
|
||||
end
|
||||
|
||||
describe "#to_ary" do
|
||||
it "returns a PATH array" do
|
||||
expect(described_class.new("/path1", "/path2").to_ary).to eq(["/path1", "/path2"])
|
||||
end
|
||||
end
|
||||
|
||||
describe "#to_str" do
|
||||
it "returns a PATH string" do
|
||||
expect(described_class.new("/path1", "/path2").to_str).to eq("/path1:/path2")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#prepend" do
|
||||
it "prepends a path to a PATH" do
|
||||
expect(described_class.new("/path1").prepend("/path2").to_str).to eq("/path2:/path1")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#append" do
|
||||
it "prepends a path to a PATH" do
|
||||
expect(described_class.new("/path1").append("/path2").to_str).to eq("/path1:/path2")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#validate" do
|
||||
it "returns a new PATH without non-existent paths" do
|
||||
allow(File).to receive(:directory?).with("/path1").and_return(true)
|
||||
allow(File).to receive(:directory?).with("/path2").and_return(false)
|
||||
|
||||
path = described_class.new("/path1", "/path2")
|
||||
expect(path.validate.to_ary).to eq(["/path1"])
|
||||
expect(path.to_ary).to eq(["/path1", "/path2"])
|
||||
end
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user