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
|
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 "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_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_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/
special/
special/test{1}/
subdir_one/
subdir_two/
]
Dir.glob('**/', File::FNM_DOTMATCH).sort.should == expected
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/
./special/
./special/test{1}/
./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 "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('**/**/**').empty?.should == false
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
end
end
|