public
Description: RSpec-style specification for the Ruby programming language
Homepage: http://rubyspec.org
Clone URL: git://github.com/brixen/rubyspec.git
rubyspec / 1.8 / core / dir / shared / glob.rb
100644 221 lines (178 sloc) 6.998 kb
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
shared :dir_glob do |cmd|
  describe "Dir.#{cmd}" do
    before(:all) do
      @cwd = Dir.pwd
      Dir.chdir DirSpecs.mock_dir
    end
    
    it "matches non-dotfiles with '*'" do
      expected = %w[
deeply
dir
dir_filename_ordering
file_one.ext
file_two.ext
nondotfile
special
subdir_one
subdir_two
]
 
      Dir.send(cmd,'*').sort.should == expected
    end
 
    it "returns empty array when empty pattern provided" do
      Dir.send(cmd, '').should == []
    end
 
    it "matches regexp special +" do
      Dir.send(cmd, 'special/+').should == ['special/+']
    end
 
    platform_is_not :windows do
      it "matches regexp special *" do
        Dir.send(cmd, 'special/\*').should == ['special/*']
      end
 
      it "matches regexp special ?" do
        Dir.send(cmd, 'special/\?').should == ['special/?']
      end
 
      it "matches regexp special |" do
        Dir.send(cmd, 'special/|').should == ['special/|']
      end
    end
 
    it "matches regexp special ^" do
      Dir.send(cmd, 'special/^').should == ['special/^']
    end
 
    it "matches regexp special $" do
      Dir.send(cmd, 'special/$').should == ['special/$']
    end
 
    it "matches regexp special (" do
      Dir.send(cmd, 'special/(').should == ['special/(']
    end
 
    it "matches regexp special )" do
      Dir.send(cmd, 'special/)').should == ['special/)']
    end
 
    it "matches regexp special [" do
      Dir.send(cmd, 'special/\[').should == ['special/[']
    end
 
    it "matches regexp special ]" do
      Dir.send(cmd, 'special/]').should == ['special/]']
    end
 
    it "matches regexp special {" do
      Dir.send(cmd, 'special/\{').should == ['special/{']
    end
 
    it "matches regexp special }" do
      Dir.send(cmd, 'special/\}').should == ['special/}']
    end
 
    it "matches dotfiles with '.*'" do
      Dir.send(cmd, '.*').sort.should == %w|. .. .dotfile .dotsubdir|.sort
end
 
it "matches non-dotfiles with '*<non-special characters>'" do
Dir.send(cmd, '*file').sort.should == %w|nondotfile|.sort
end
 
it "matches dotfiles with '.*<non-special characters>'" do
Dir.send(cmd, '.*file').sort.should == %w|.dotfile|.sort
end
 
it "matches files with any ending with '<non-special characters>*'" do
Dir.send(cmd, 'file*').sort.should == %w|file_one.ext file_two.ext|.sort
end
 
it "matches files with any middle with '<non-special characters>*<non-special characters>'" do
Dir.send(cmd, 'sub*_one').sort.should == %w|subdir_one|.sort
end
 
it "matches files with multiple '*' special characters" do
Dir.send(cmd, '*fi*e*').sort.should == %w|dir_filename_ordering nondotfile file_one.ext file_two.ext|.sort
end
 
it "matches non-dotfiles in the current directory with '**'" do
expected = %w[
deeply
dir
dir_filename_ordering
file_one.ext
file_two.ext
nondotfile
special
subdir_one
subdir_two
]
 
Dir.send(cmd, '**').sort.should == expected
end
 
it "matches dotfiles in the current directory with '.**'" do
Dir.send(cmd, '.**').sort.should == %w|. .. .dotsubdir .dotfile|.sort
end
 
it "recursively matches any nondot subdirectories with '**/'" do
expected = %w[
deeply/
deeply/nested/
deeply/nested/directory/
deeply/nested/directory/structure/
dir/
special/
subdir_one/
subdir_two/
]
 
Dir.send(cmd, '**/').sort.should == expected
end
 
it "recursively matches any subdirectories including ./ and ../ with '.**/'" do
Dir.chdir("#{DirSpecs.mock_dir}/subdir_one") do
Dir.send(cmd, '.**/').sort.should == %w|./ ../|.sort
end
end
 
it "matches a single character except leading '.' with '?'" do
Dir.send(cmd, '?ubdir_one').sort.should == %w|subdir_one|.sort
end
 
it "accepts multiple '?' characters in a pattern" do
Dir.send(cmd, 'subdir_???').sort.should == %w|subdir_one subdir_two|.sort
end
 
it "matches any characters in a set with '[<characters>]'" do
Dir.send(cmd, '[stfu]ubdir_one').sort.should == %w|subdir_one|.sort
end
 
it "matches any characters in a range with '[<character>-<character>]'" do
Dir.send(cmd, '[a-zA-Z]ubdir_one').sort.should == %w|subdir_one|.sort
end
 
it "matches any characters except those in a set with '[^<characters>]'" do
Dir.send(cmd, '[^wtf]ubdir_one').sort.should == %w|subdir_one|.sort
end
 
it "matches any characters except those in a range with '[^<character>-<character]'" do
Dir.send(cmd, '[^0-9]ubdir_one').sort.should == %w|subdir_one|.sort
end
 
it "matches any one of the strings in a set with '{<string>,<other>,...}'" do
Dir.send(cmd, 'subdir_{one,two,three}').sort.should == %w|subdir_one subdir_two|.sort
end
 
it "accepts string sets with empty strings with {<string>,,<other>}" do
a = Dir.send(cmd, 'deeply/nested/directory/structure/file_one{.ext,}').sort
a.should == %w|deeply/nested/directory/structure/file_one.ext
deeply/nested/directory/structure/file_one|.sort
end
 
it "matches dot or non-dotfiles with '{,.}*'" do
Dir.send(cmd, '{,.}*').sort.should == DirSpecs.expected_paths
end
 
it "matches special characters by escaping with a backslash with '\\<character>'" do
Dir.mkdir 'foo*bar'
 
begin
Dir.glob('foo?bar').should == %w|foo*bar|
Dir.glob('foo\?bar').should == []
Dir.glob('nond\otfile').should == %w|nondotfile|
ensure
Dir.rmdir 'foo*bar'
end
end
 
it "recursively matches directories with '**/<characters>'" do
%w|glob []|.each {|cmd|
Dir.send(cmd, '**/*fil?{,.}*').sort.should == %w|deeply/nested/directory/structure/file_one
deeply/nested/directory/structure/file_one.ext
deeply/nondotfile
dir/filename_ordering
dir_filename_ordering
file_one.ext file_two.ext
nondotfile subdir_one/nondotfile
subdir_two/nondotfile
subdir_two/nondotfile.ext
subdir_two/nondotfile.ext|
}
end
 
it "orders directory-based entries before files when a glob matches both" do
expected = %w[dir/filename_ordering dir_filename_ordering]
%w|glob []|.each do |cmd|
        Dir.send(cmd, '**/*filename_ordering').should == expected
      end
    end
 
    after(:all) do
      Dir.chdir @cwd
    end
  end
end