filepath 0.3.1 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,7 @@
1
1
  # This is free and unencumbered software released into the public domain.
2
2
  # See the `UNLICENSE` file or <http://unlicense.org/> for more details.
3
3
 
4
+
4
5
  class FilePathList
5
6
  include Enumerable
6
7
 
@@ -36,16 +37,29 @@ class FilePathList
36
37
  return FilePathList.new(@entries + extra_entries.to_a)
37
38
  end
38
39
 
39
- def -(others) # FIXME: block
40
- if others.is_a? Regexp # FIXME: support any object that responds to =~
41
- remaining_entries = @entries.delete_if { |e| e =~ others }
40
+ def -(others)
41
+ remaining_entries = @entries - others.as_path_list.to_a
42
+
43
+ return FilePathList.new(remaining_entries)
44
+ end
45
+
46
+ def exclude(pattern = nil, &block)
47
+ if block_given?
48
+ select { |e| !block.call(e) }
42
49
  else
43
- remaining_entries = @entries - others.as_path_list.to_a
50
+ select { |e| !(e =~ pattern) }
51
+ end
52
+ end
53
+
54
+ def select(pattern = nil, &block)
55
+ if !block_given?
56
+ block = proc { |e| e =~ pattern }
44
57
  end
45
58
 
59
+ remaining_entries = @entries.select { |e| block.call(e) }
60
+
46
61
  return FilePathList.new(remaining_entries)
47
62
  end
48
- alias :exclude :-
49
63
 
50
64
  def <<(extra_path)
51
65
  return FilePathList.new(@entries + [extra_path.as_path])
@@ -60,16 +74,16 @@ class FilePathList
60
74
  return FilePathList.new(paths)
61
75
  end
62
76
 
63
- def remove_common_fragments
64
- all_frags = @entries.map(&:fragments)
65
- max_length = all_frags.map(&:length).min
77
+ def remove_common_segments
78
+ all_segs = @entries.map(&:segments)
79
+ max_length = all_segs.map(&:length).min
66
80
 
67
81
  idx_different = nil
68
82
 
69
83
  (0..max_length).each do |i|
70
- fragment = all_frags.first[i]
84
+ segment = all_segs.first[i]
71
85
 
72
- different = all_frags.any? { |frags| frags[i] != fragment }
86
+ different = all_segs.any? { |segs| segs[i] != segment }
73
87
  if different
74
88
  idx_different = i
75
89
  break
@@ -78,9 +92,9 @@ class FilePathList
78
92
 
79
93
  idx_different ||= max_length
80
94
 
81
- remaining_frags = all_frags.map { |frags| frags[idx_different..-1] }
95
+ remaining_segs = all_segs.map { |segs| segs[idx_different..-1] }
82
96
 
83
- return FilePathList.new(remaining_frags)
97
+ return FilePathList.new(remaining_segs)
84
98
  end
85
99
 
86
100
  # @return [FilePathList] the path list itself
@@ -97,6 +111,8 @@ class FilePathList
97
111
  @to_s ||= @entries.map(&:to_str).join(SEPARATOR)
98
112
  end
99
113
 
114
+
115
+ # @private
100
116
  def inspect
101
117
  @entries.inspect
102
118
  end
@@ -106,6 +122,7 @@ class FilePathList
106
122
  end
107
123
 
108
124
  module ArrayMethods
125
+ # @private
109
126
  def self.define_array_method(name)
110
127
  define_method(name) do |*args, &block|
111
128
  return @entries.send(name, *args, &block)
@@ -121,26 +138,9 @@ class FilePathList
121
138
  define_array_method :each
122
139
 
123
140
  define_array_method :map
141
+
142
+ define_array_method :size
124
143
  end
125
144
 
126
145
  include ArrayMethods
127
146
  end
128
-
129
- class Array
130
- # Generates a path list from an array of paths.
131
- #
132
- # The elements of the array must respond to `#as_path`.
133
- #
134
- # `ary.as_path` is equivalent to `FilePathList.new(ary)`.
135
- #
136
- # @return [FilePathList] a new path list containing the elements of
137
- # the array as FilePaths
138
- #
139
- # @see String#as_path
140
- # @see Array#as_path
141
- # @see FilePath#as_path
142
-
143
- def as_path_list
144
- FilePathList.new(self)
145
- end
146
- end
@@ -264,6 +264,24 @@ describe FilePath do
264
264
  end
265
265
  end
266
266
 
267
+ describe "#root?" do
268
+ it "says that </> points to the root directory" do
269
+ FilePath.new('/').should be_root
270
+ end
271
+
272
+ it "says that </..> points to the root directory" do
273
+ FilePath.new('/..').should be_root
274
+ end
275
+
276
+ it "says that <a/b> does not point to the root directory" do
277
+ FilePath.new('a/b').should_not be_root
278
+ end
279
+
280
+ it "says that </foo> does not point to the root directory" do
281
+ FilePath.new('/foo/bar').should_not be_root
282
+ end
283
+ end
284
+
267
285
  describe "#absolute?" do
268
286
  it "says that `/foo/bar` is absolute" do
269
287
  FilePath.new('/foo/bar').should be_absolute
@@ -295,7 +313,7 @@ describe FilePath do
295
313
  end
296
314
 
297
315
  describe "#ascend" do
298
- it "goes through all the fragments of an absolute path" do
316
+ it "goes through all the segments of an absolute path" do
299
317
  steps = []
300
318
  FilePath.new("/a/b/c").ascend do |p|
301
319
  steps << p
@@ -308,7 +326,7 @@ describe FilePath do
308
326
  steps[3].should eq("/")
309
327
  end
310
328
 
311
- it "goes through all the fragments of a relative path" do
329
+ it "goes through all the segments of a relative path" do
312
330
  steps = []
313
331
  FilePath.new("a/b/c").ascend do |p|
314
332
  steps << p
@@ -319,10 +337,15 @@ describe FilePath do
319
337
  steps[1].should eq("a/b")
320
338
  steps[2].should eq("a")
321
339
  end
340
+
341
+ it "returns the path itself" do
342
+ path = FilePath.new("/a/b/c/")
343
+ path.ascend { }.should be(path)
344
+ end
322
345
  end
323
346
 
324
347
  describe "#descend" do
325
- it "goes through all the fragments of an absolute path" do
348
+ it "goes through all the segments of an absolute path" do
326
349
  steps = []
327
350
  FilePath.new("/a/b/c").descend do |p|
328
351
  steps << p
@@ -335,7 +358,7 @@ describe FilePath do
335
358
  steps[3].should eq("/a/b/c")
336
359
  end
337
360
 
338
- it "goes through all the fragments of a relative path" do
361
+ it "goes through all the segments of a relative path" do
339
362
  steps = []
340
363
  FilePath.new("a/b/c").descend do |p|
341
364
  steps << p
@@ -346,6 +369,11 @@ describe FilePath do
346
369
  steps[1].should eq("a/b")
347
370
  steps[2].should eq("a/b/c")
348
371
  end
372
+
373
+ it "returns the path itself" do
374
+ path = FilePath.new("/a/b/c/")
375
+ path.descend { }.should be(path)
376
+ end
349
377
  end
350
378
 
351
379
  describe "#to_s" do
@@ -580,11 +608,38 @@ describe FilePath do
580
608
  end
581
609
  end
582
610
 
611
+ describe "#find" do
612
+ it "finds all paths matching a glob string" do
613
+ list = @root.find('*1')
614
+
615
+ list.should have(6).items
616
+ list.each { |path| path.should =~ /1/ }
617
+ end
618
+
619
+ it "finds all paths matching a Regex" do
620
+ list = @root.find(/2/)
621
+
622
+ list.should have(5).items
623
+ list.each { |path| path.should =~ /2/ }
624
+ end
625
+
626
+ it "finds all paths for which the block returns true" do
627
+ list = @root.find { |path| path.directory? }
628
+
629
+ list.should have(9).items
630
+ list.each { |path| path.filename.should =~ /^d/ }
631
+ end
632
+ end
633
+
583
634
  describe "#files" do
584
635
  it "finds 1 file in the root directory" do
585
636
  @root.files.should have(1).item
586
637
  end
587
638
 
639
+ it "finds 3 files in the root directory and its sub directories" do
640
+ @root.files(true).should have(3).item
641
+ end
642
+
588
643
  it "finds 2 files in directory <d1>" do
589
644
  (@root / 'd1').files.should have(2).items
590
645
  end
@@ -599,6 +654,10 @@ describe FilePath do
599
654
  @root.directories.should have(4).items
600
655
  end
601
656
 
657
+ it "finds 9 directories in the root directory and its sub directories" do
658
+ @root.directories(true).should have(9).item
659
+ end
660
+
602
661
  it "finds 2 directories in directory <d2>" do
603
662
  (@root / 'd2').directories.should have(2).items
604
663
  end
@@ -36,12 +36,6 @@ describe FilePathList do
36
36
  end
37
37
  end
38
38
 
39
- describe "#exclude" do
40
- list = FilePathList.new(%w{a.foo b.bar c.foo d.foo b.bar})
41
- refined = list.exclude(/bar$/)
42
- refined.each { |path| path.extension.should == 'foo' }
43
- end
44
-
45
39
  describe "#/" do
46
40
  it "adds the same string to all the paths" do
47
41
  list = FilePathList.new(%w{foo faa}) / 'bar'
@@ -75,6 +69,45 @@ describe FilePathList do
75
69
  end
76
70
  end
77
71
 
72
+ describe "#exclude" do
73
+ let(:list) { FilePathList.new(%w{a.foo b.bar c.foo d.foo b.bar}) }
74
+
75
+ it "excludes paths matching a Regex" do
76
+ remaining = list.exclude(/bar$/)
77
+
78
+ remaining.should be_a FilePathList
79
+ remaining.should have(3).items
80
+ remaining.each { |path| path.extension.should == 'foo' }
81
+ end
82
+
83
+ it "excludes all the paths for which the block returns true" do
84
+ remaining = list.exclude { |path| path.extension?('bar') }
85
+
86
+ remaining.should be_a FilePathList
87
+ remaining.should have(3).items
88
+ remaining.each { |path| path.extension.should == 'foo' }
89
+ end
90
+ end
91
+
92
+ describe "#select" do
93
+ let(:list) { FilePathList.new(%w{a.foo b.bar c.foo d.foo b.bar}) }
94
+
95
+ it "keeps paths matching a Regex" do
96
+ remaining = list.select(/bar$/)
97
+
98
+ remaining.should be_a FilePathList
99
+ remaining.should have(2).items
100
+ remaining.each { |path| path.extension.should == 'bar' }
101
+ end
102
+
103
+ it "keeps all the paths for which the block returns true" do
104
+ remaining = list.select { |ph| ph.extension?('bar') }
105
+
106
+ remaining.should have(2).items
107
+ remaining.each { |ph| ph.extension.should == 'bar' }
108
+ end
109
+ end
110
+
78
111
  describe "#<<" do
79
112
  it "adds a new to path to a existing FilePathList" do
80
113
  list1 = FilePathList.new(%w{a/b /c/d})
@@ -133,10 +166,10 @@ describe FilePathList do
133
166
  end
134
167
  end
135
168
 
136
- describe "#remove_common_fragments" do
169
+ describe "#remove_common_segments" do
137
170
  it "works on lists of files from the same dir" do
138
171
  paths = %w{a/b/x1 a/b/x2 a/b/x3}
139
- list = FilePathList.new(paths).remove_common_fragments
172
+ list = FilePathList.new(paths).remove_common_segments
140
173
 
141
174
  list.should have(3).items
142
175
  list.should include(*%w{x1 x2 x3})
@@ -144,16 +177,16 @@ describe FilePathList do
144
177
 
145
178
  it "works on lists of files from different dirs" do
146
179
  list1 = FilePathList.new(%w{a/b/x1 a/b/c/x2 a/b/d/e/x3})
147
- list2 = list1.remove_common_fragments
180
+ list2 = list1.remove_common_segments
148
181
 
149
182
  list2.should have(3).items
150
183
  list2.should include(*%w{x1 c/x2 d/e/x3})
151
184
  end
152
185
 
153
- it "works on lists of files with no common fragments" do
186
+ it "works on lists of files with no common segments" do
154
187
  paths = %w{a/b a/d g/f}
155
188
  list1 = FilePathList.new(paths)
156
- list2 = list1.remove_common_fragments
189
+ list2 = list1.remove_common_segments
157
190
 
158
191
  list1.should == list2
159
192
  end
@@ -161,7 +194,7 @@ describe FilePathList do
161
194
  it "works on lists that contain duplicates only" do
162
195
  paths = %w{a/b a/b a/b}
163
196
  list1 = FilePathList.new(paths)
164
- list2 = list1.remove_common_fragments
197
+ list2 = list1.remove_common_segments
165
198
 
166
199
  list2.should == FilePathList.new(['.', '.', '.'])
167
200
  end
@@ -2,7 +2,6 @@ LIB_DIR = File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib]))
2
2
  $LOAD_PATH.unshift(LIB_DIR) unless $LOAD_PATH.include?(LIB_DIR)
3
3
 
4
4
  require 'filepath'
5
- require 'filepathlist'
6
5
 
7
6
  RSpec.configure do |config|
8
7
  config.filter_run_excluding :broken => true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filepath
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: '0.4'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-21 00:00:00.000000000 Z
12
+ date: 2012-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bones-rspec
16
- requirement: &21597840 !ruby/object:Gem::Requirement
16
+ requirement: &19274420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.0.1
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *21597840
24
+ version_requirements: *19274420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bones
27
- requirement: &21595900 !ruby/object:Gem::Requirement
27
+ requirement: &19273040 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 3.7.3
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *21595900
35
+ version_requirements: *19273040
36
36
  description: ! 'filepath is a small library that helps dealing with files, directories
37
37
  and
38
38
 
@@ -48,7 +48,10 @@ files:
48
48
  - Rakefile
49
49
  - UNLICENSE
50
50
  - lib/filepath.rb
51
- - lib/filepathlist.rb
51
+ - lib/filepath/core_ext/array.rb
52
+ - lib/filepath/core_ext/string.rb
53
+ - lib/filepath/filepath.rb
54
+ - lib/filepath/filepathlist.rb
52
55
  - spec/filepath_spec.rb
53
56
  - spec/filepathlist_spec.rb
54
57
  - spec/spec_helper.rb