2018-03-04 15:09:32 +00:00
require_relative '../../spec_helper'
require_relative 'fixtures/common'
require_relative 'shared/glob'
2017-05-07 12:04:49 +00:00
describe " Dir.glob " do
it_behaves_like :dir_glob , :glob
end
describe " Dir.glob " do
it_behaves_like :dir_glob_recursive , :glob
end
describe " Dir.glob " do
before :each do
DirSpecs . create_mock_dirs
@cwd = Dir . pwd
Dir . chdir DirSpecs . mock_dir
end
after :each do
Dir . chdir @cwd
DirSpecs . delete_mock_dirs
end
it " can take an array of patterns " do
Dir . glob ( [ " file_o* " , " file_t* " ] ) . should ==
%w!file_one.ext file_two.ext!
end
2021-07-29 22:11:21 +02:00
it 'returns matching file paths when supplied :base keyword argument' do
dir = tmp ( 'dir_glob_base' )
file_1 = " #{ dir } /lib/bloop.rb "
file_2 = " #{ dir } /lib/soup.rb "
file_3 = " #{ dir } /lib/mismatched_file_type.txt "
file_4 = " #{ dir } /mismatched_directory.rb "
touch file_1
touch file_2
touch file_3
touch file_4
Dir . glob ( '**/*.rb' , base : " #{ dir } /lib " ) . sort . should == [ " bloop.rb " , " soup.rb " ] . sort
ensure
rm_r dir
end
2017-05-07 12:04:49 +00:00
it " calls # to_path to convert multiple patterns " do
pat1 = mock ( 'file_one.ext' )
pat1 . should_receive ( :to_path ) . and_return ( 'file_one.ext' )
pat2 = mock ( 'file_two.ext' )
pat2 . should_receive ( :to_path ) . and_return ( 'file_two.ext' )
Dir . glob ( [ pat1 , pat2 ] ) . should == %w[ file_one.ext file_two.ext ]
end
it " matches both dot and non-dotfiles with '*' and option File::FNM_DOTMATCH " do
2021-01-12 18:17:02 +09:00
Dir . glob ( '*' , File :: FNM_DOTMATCH ) . sort . should == DirSpecs . expected_glob_paths
2017-05-07 12:04:49 +00:00
end
it " matches files with any beginning with '*<non-special characters>' and option File::FNM_DOTMATCH " do
Dir . glob ( '*file' , File :: FNM_DOTMATCH ) . sort . should == %w|.dotfile nondotfile| . sort
end
it " matches any files in the current directory with '**' and option File::FNM_DOTMATCH " do
2021-01-12 18:17:02 +09:00
Dir . glob ( '**' , File :: FNM_DOTMATCH ) . sort . should == DirSpecs . expected_glob_paths
2017-05-07 12:04:49 +00:00
end
it " recursively matches any subdirectories except './' or '../' with '**/' from the current directory and option File::FNM_DOTMATCH " do
expected = %w[
. dotsubdir /
brace /
deeply /
deeply / nested /
deeply / nested / directory /
deeply / nested / directory / structure /
dir /
2020-11-27 14:55:31 +01:00
nested /
nested / . dotsubir /
2017-05-07 12:04:49 +00:00
special /
special / test { 1 } /
2021-09-07 19:01:07 +02:00
special / { } /
2017-05-07 12:04:49 +00:00
subdir_one /
subdir_two /
]
Dir . glob ( '**/' , File :: FNM_DOTMATCH ) . sort . should == expected
end
2021-01-12 18:17:02 +09:00
ruby_version_is '' ... '3.1' do
it " recursively matches files and directories in nested dot subdirectory with 'nested/**/*' from the current directory and option File::FNM_DOTMATCH " do
expected = %w[
nested / .
nested / . dotsubir
nested / . dotsubir / .
nested / . dotsubir / . dotfile
nested / . dotsubir / nondotfile
]
Dir . glob ( 'nested/**/*' , File :: FNM_DOTMATCH ) . sort . should == expected . sort
end
end
2020-11-27 14:55:31 +01:00
2021-01-12 18:17:02 +09:00
ruby_version_is '3.1' do
it " recursively matches files and directories in nested dot subdirectory except . with 'nested/**/*' from the current directory and option File::FNM_DOTMATCH " do
expected = %w[
nested / .
nested / . dotsubir
nested / . dotsubir / . dotfile
nested / . dotsubir / nondotfile
]
Dir . glob ( 'nested/**/*' , File :: FNM_DOTMATCH ) . sort . should == expected . sort
end
2020-11-27 14:55:31 +01:00
end
2017-10-28 15:15:48 +00:00
# This is a separate case to check **/ coming after a constant
2017-05-07 12:04:49 +00:00
# directory as well.
it " recursively matches any subdirectories except './' or '../' with '**/' and option File::FNM_DOTMATCH " do
expected = %w[
. /
. / . dotsubdir /
. / brace /
. / deeply /
. / deeply / nested /
. / deeply / nested / directory /
. / deeply / nested / directory / structure /
. / dir /
2020-11-27 14:55:31 +01:00
. / nested /
. / nested / . dotsubir /
2017-05-07 12:04:49 +00:00
. / special /
. / special / test { 1 } /
2021-09-07 19:01:07 +02:00
. / special / { } /
2017-05-07 12:04:49 +00:00
. / subdir_one /
. / subdir_two /
]
Dir . glob ( './**/' , File :: FNM_DOTMATCH ) . sort . should == expected
end
it " matches a list of paths by concatenating their individual results " do
expected = %w[
deeply /
deeply / nested /
deeply / nested / directory /
deeply / nested / directory / structure /
subdir_two / nondotfile
subdir_two / nondotfile . ext
]
Dir . glob ( '{deeply/**/,subdir_two/*}' ) . sort . should == expected
end
2021-07-29 22:11:21 +02:00
it " preserves multiple /s before a ** " do
expected = %w[
deeply / / nested / directory / structure
]
Dir . glob ( '{deeply//**/structure}' ) . sort . should == expected
end
2017-05-07 12:04:49 +00:00
it " accepts a block and yields it with each elements " do
ary = [ ]
ret = Dir . glob ( [ " file_o* " , " file_t* " ] ) { | t | ary << t }
ret . should be_nil
ary . should == %w!file_one.ext file_two.ext!
end
it " ignores non-dirs when traversing recursively " do
touch " spec "
Dir . glob ( " spec/**/*.rb " ) . should == [ ]
end
it " matches nothing when given an empty list of paths " do
Dir . glob ( '{}' ) . should == [ ]
end
it " handles infinite directory wildcards " do
2020-05-03 12:28:29 +02:00
Dir . glob ( '**/**/**' ) . should_not . empty?
2017-05-07 12:04:49 +00:00
end
2018-03-26 20:48:21 +00:00
it " handles simple filename patterns " do
Dir . glob ( '.dotfile' ) . should == [ '.dotfile' ]
end
it " handles simple directory patterns " do
Dir . glob ( '.dotsubdir/' ) . should == [ '.dotsubdir/' ]
end
it " handles simple directory patterns applied to non-directories " do
Dir . glob ( 'nondotfile/' ) . should == [ ]
end
2017-05-07 12:04:49 +00:00
platform_is_not ( :windows ) do
it " matches the literal character ' \\ ' with option File::FNM_NOESCAPE " do
Dir . mkdir 'foo?bar'
begin
Dir . glob ( 'foo?bar' , File :: FNM_NOESCAPE ) . should == %w|foo?bar|
Dir . glob ( 'foo\?bar' , File :: FNM_NOESCAPE ) . should == [ ]
ensure
Dir . rmdir 'foo?bar'
end
Dir . mkdir 'foo\?bar'
begin
Dir . glob ( 'foo\?bar' , File :: FNM_NOESCAPE ) . should == %w|foo\\?bar|
ensure
Dir . rmdir 'foo\?bar'
end
end
it " returns nil for directories current user has no permission to read " do
Dir . mkdir ( 'no_permission' )
File . chmod ( 0 , 'no_permission' )
begin
Dir . glob ( 'no_permission/*' ) . should == [ ]
ensure
Dir . rmdir ( 'no_permission' )
end
end
end
end