1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
|
require_relative '../../spec_helper'
require_relative 'fixtures/common'
require_relative 'shared/glob'
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
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
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
Dir.glob('*', File::FNM_DOTMATCH).sort.should == DirSpecs.expected_glob_paths
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
Dir.glob('**', File::FNM_DOTMATCH).sort.should == DirSpecs.expected_glob_paths
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/
nested/
nested/.dotsubir/
special/
special/test\ +()[]{}/
special/test{1}/
special/{}/
subdir_one/
subdir_two/
]
Dir.glob('**/', File::FNM_DOTMATCH).sort.should == expected
end
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
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
end
# This is a separate case to check **/ coming after a constant
# 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/
./nested/
./nested/.dotsubir/
./special/
./special/test\ +()[]{}/
./special/test{1}/
./special/{}/
./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
it "preserves multiple /s before a **" do
expected = %w[
deeply//nested/directory/structure
]
Dir.glob('{deeply//**/structure}').sort.should == expected
end
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
Dir.glob('**/**/**').should_not.empty?
end
it "handles **/** with base keyword argument" do
Dir.glob('**/**', base: "dir").should == ["filename_ordering"]
expected = %w[
nested
nested/directory
nested/directory/structure
nested/directory/structure/bar
nested/directory/structure/baz
nested/directory/structure/file_one
nested/directory/structure/file_one.ext
nested/directory/structure/foo
nondotfile
].sort
Dir.glob('**/**', base: "deeply").sort.should == expected
end
it "handles **/ with base keyword argument" do
expected = %w[
/
directory/
directory/structure/
]
Dir.glob('**/', base: "deeply/nested").sort.should == expected
end
it "handles **/nondotfile with base keyword argument" do
expected = %w[
deeply/nondotfile
nondotfile
subdir_one/nondotfile
subdir_two/nondotfile
]
Dir.glob('**/nondotfile', base: ".").sort.should == expected
end
it "handles **/nondotfile with base keyword argument and FNM_DOTMATCH" do
expected = %w[
.dotsubdir/nondotfile
deeply/nondotfile
nested/.dotsubir/nondotfile
nondotfile
subdir_one/nondotfile
subdir_two/nondotfile
]
Dir.glob('**/nondotfile', File::FNM_DOTMATCH, base: ".").sort.should == expected
end
it "handles **/.dotfile with base keyword argument" do
expected = %w[
.dotfile
deeply/.dotfile
subdir_one/.dotfile
]
Dir.glob('**/.dotfile', base: ".").sort.should == expected
end
it "handles **/.dotfile with base keyword argument and FNM_DOTMATCH" do
expected = %w[
.dotfile
.dotsubdir/.dotfile
deeply/.dotfile
nested/.dotsubir/.dotfile
subdir_one/.dotfile
]
Dir.glob('**/.dotfile', File::FNM_DOTMATCH, base: ".").sort.should == expected
end
it "handles **/.* with base keyword argument" do
expected = %w[
.dotfile.ext
directory/structure/.ext
].sort
Dir.glob('**/.*', base: "deeply/nested").sort.should == expected
end
# < 3.1 include a "." entry for every dir: ["directory/.", "directory/structure/.", ...]
ruby_version_is '3.1' do
it "handles **/.* with base keyword argument and FNM_DOTMATCH" do
expected = %w[
.
.dotfile.ext
directory/structure/.ext
].sort
Dir.glob('**/.*', File::FNM_DOTMATCH, base: "deeply/nested").sort.should == expected
end
it "handles **/** with base keyword argument and FNM_DOTMATCH" do
expected = %w[
.
.dotfile.ext
directory
directory/structure
directory/structure/.ext
directory/structure/bar
directory/structure/baz
directory/structure/file_one
directory/structure/file_one.ext
directory/structure/foo
].sort
Dir.glob('**/**', File::FNM_DOTMATCH, base: "deeply/nested").sort.should == expected
end
end
it "handles **/*pattern* with base keyword argument and FNM_DOTMATCH" do
expected = %w[
.dotfile.ext
directory/structure/file_one
directory/structure/file_one.ext
]
Dir.glob('**/*file*', File::FNM_DOTMATCH, base: "deeply/nested").sort.should == expected
end
it "handles **/glob with base keyword argument and FNM_EXTGLOB" do
expected = %w[
directory/structure/bar
directory/structure/file_one
directory/structure/file_one.ext
]
Dir.glob('**/*{file,bar}*', File::FNM_EXTGLOB, base: "deeply/nested").sort.should == expected
end
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
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
it "will follow symlinks when processing a `*/` pattern." do
expected = ['special/ln/nondotfile']
Dir.glob('special/*/nondotfile').should == expected
end
it "will not follow symlinks when recursively traversing directories" do
expected = %w[
deeply/nondotfile
nondotfile
subdir_one/nondotfile
subdir_two/nondotfile
]
Dir.glob('**/nondotfile').sort.should == expected
end
it "will follow symlinks when testing directory after recursive directory in pattern" do
expected = %w[
deeply/nondotfile
special/ln/nondotfile
subdir_one/nondotfile
subdir_two/nondotfile
]
Dir.glob('**/*/nondotfile').sort.should == expected
end
end
end
|