support globbing to files and partial path part matches
This commit is contained in:
parent
3b6eb053de
commit
76002ea431
@ -22,15 +22,25 @@ module FakeFS
|
|||||||
def find(path)
|
def find(path)
|
||||||
parts = path_parts(normalize_path(path))
|
parts = path_parts(normalize_path(path))
|
||||||
|
|
||||||
target = parts[0...-1].inject(fs) do |dir, part|
|
entries = find_recurser(fs, parts).flatten
|
||||||
dir[part] || {}
|
|
||||||
|
case entries.length
|
||||||
|
when 0 then nil
|
||||||
|
when 1 then entries.first
|
||||||
|
else entries
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
case parts.last
|
def find_recurser(dir, parts)
|
||||||
when '*'
|
return [] unless dir.respond_to? :[]
|
||||||
target.values
|
|
||||||
|
pattern , *parts = parts
|
||||||
|
matches = dir.reject {|k,v| /\A#{pattern.gsub('*', '.*')}\Z/ !~ k }.values
|
||||||
|
|
||||||
|
if parts.empty? # we're done recursing
|
||||||
|
matches
|
||||||
else
|
else
|
||||||
target[parts.last]
|
matches.map{|entry| find_recurser(entry, parts) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -203,9 +203,11 @@ class FakeFSTest < Test::Unit::TestCase
|
|||||||
assert_equal %w( /path/bar /path/bar2 /path/foo /path/foobar ), Dir['/path/*']
|
assert_equal %w( /path/bar /path/bar2 /path/foo /path/foobar ), Dir['/path/*']
|
||||||
|
|
||||||
assert_equal ['/path/bar/baz'], Dir['/path/bar/*']
|
assert_equal ['/path/bar/baz'], Dir['/path/bar/*']
|
||||||
|
assert_equal ['/path/foo'], Dir['/path/foo']
|
||||||
|
|
||||||
# Unsupported so far. More hackery than I want to work on right now
|
# Unsupported so far. More hackery than I want to work on right now
|
||||||
# assert_equal ['/path'], Dir['/path*']
|
assert_equal ['/path/foo', '/path/foobar'], Dir['/path/foo*']
|
||||||
|
assert_equal ['/path'], Dir['/path*']
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_chdir_changes_directories_like_a_boss
|
def test_chdir_changes_directories_like_a_boss
|
||||||
|
Loading…
Reference in New Issue
Block a user