Skip to content
Snippets Groups Projects
Commit a1674690 authored by Markus Reiter's avatar Markus Reiter
Browse files

Add `PATH` class.

parent e221d048
No related branches found
No related tags found
No related merge requests found
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"
......
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment