file-find 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.3.0 - 30-Dec-2008
2
+ * Added support for FileTest operations. All options passed to the constructor
3
+ that end with '?' are now validated and treated as FileTest operations.
4
+
1
5
  == 0.2.5 - 29-Dec-2008
2
6
  * Added maxdepth and mindepth support.
3
7
  * Added a 'clean' rake task to cleanup any test-unit results files.
data/MANIFEST CHANGED
@@ -4,4 +4,4 @@
4
4
  * README
5
5
  * file-find.gemspec
6
6
  * lib/file/find.rb
7
- * test/tc_find.rb
7
+ * test/test_file_find.rb
data/README CHANGED
@@ -43,6 +43,9 @@ few options, hasn't been updated in over six years and isn't packaged properly.
43
43
  * size
44
44
  * user (name or id)
45
45
 
46
+ In addition to the above options, FileTest methods such as 'readable?' and
47
+ 'writable?' may be used as keys, with true or false for their values.
48
+
46
49
  See the RDoc documentation for more details about these options.
47
50
 
48
51
  = Future Plans
@@ -52,7 +55,6 @@ http://www.rubyforge.org/projects/shards.
52
55
 
53
56
  Some specific things I plan on adding:
54
57
 
55
- * general FileTest operations
56
58
  * exec
57
59
  * links
58
60
  * support for :user and :group on MS Windows
data/lib/file/find.rb CHANGED
@@ -6,7 +6,7 @@ include Sys
6
6
 
7
7
  class File::Find
8
8
  # The version of this library
9
- VERSION = '0.2.5'
9
+ VERSION = '0.3.0'
10
10
 
11
11
  # :stopdoc:
12
12
  VALID_OPTIONS = %w/
@@ -58,6 +58,11 @@ class File::Find
58
58
  #
59
59
  attr_accessor :group
60
60
 
61
+ # An array of two element arrays for storing FileTest methods and their
62
+ # boolean value.
63
+ #
64
+ attr_accessor :filetest
65
+
61
66
  # Controls the behavior of how symlinks are followed. If set to true (the
62
67
  # default), then follows the file pointed to. If false, it considers the
63
68
  # symlink itself.
@@ -135,13 +140,17 @@ class File::Find
135
140
  # object serve as the rules for determining what files the File::Find#find
136
141
  # method will search for.
137
142
  #
143
+ # In addition to the standard list of valid options, you may also use
144
+ # FileTest methods as options, setting their value to true or false.
145
+ #
138
146
  # Example:
139
147
  #
140
148
  # rule = File::Find.new(
141
- # :name => "*.rb",
142
- # :follow => false,
143
- # :path => ['/usr/local/lib', '/opt/local/lib']
144
- # )
149
+ # :name => "*.rb",
150
+ # :follow => false,
151
+ # :path => ['/usr/local/lib', '/opt/local/lib'],
152
+ # :readable? => true
153
+ # )
145
154
  #
146
155
  def initialize(options = {})
147
156
  @options = options
@@ -161,6 +170,7 @@ class File::Find
161
170
  @previous = nil
162
171
  @maxdepth = nil
163
172
  @mindepth = nil
173
+ @filetest = []
164
174
 
165
175
  validate_and_set_options(options) unless options.empty?
166
176
 
@@ -262,6 +272,22 @@ class File::Find
262
272
 
263
273
  next unless Dir[glob].include?(file)
264
274
 
275
+ unless @filetest.empty?
276
+ file_test = true
277
+
278
+ @filetest.each{ |array|
279
+ meth = array[0]
280
+ bool = array[1]
281
+
282
+ unless File.send(meth, file) == bool
283
+ file_test = false
284
+ break
285
+ end
286
+ }
287
+
288
+ next unless file_test
289
+ end
290
+
265
291
  if @atime
266
292
  date1 = Date.parse(Time.now.to_s)
267
293
  date2 = Date.parse(stat_info.atime.to_s)
@@ -356,15 +382,28 @@ class File::Find
356
382
  private
357
383
 
358
384
  # This validates that the keys are valid. If they are, it sets the value
359
- # of that key's corresponding method to the given value.
385
+ # of that key's corresponding method to the given value. If a key ends
386
+ # with a '?', it's validated as a File method.
360
387
  #
361
388
  def validate_and_set_options(options)
362
389
  options.each do |key, value|
363
390
  key = key.to_s.downcase
364
- unless VALID_OPTIONS.include?(key)
365
- raise ArgumentError, "invalid option '#{key}'"
391
+
392
+ if key[-1].chr == '?'
393
+ sym = key.to_sym
394
+
395
+ unless File.respond_to?(sym)
396
+ raise ArgumentError, "invalid option '#{key}'"
397
+ end
398
+
399
+ @filetest << [sym, value]
400
+ else
401
+ unless VALID_OPTIONS.include?(key)
402
+ raise ArgumentError, "invalid option '#{key}'"
403
+ end
404
+
405
+ send("#{key}=", value)
366
406
  end
367
- send("#{key}=", value)
368
407
  end
369
408
  end
370
409
 
@@ -52,7 +52,7 @@ class TC_File_Find < Test::Unit::TestCase
52
52
  end
53
53
 
54
54
  def test_version
55
- assert_equal('0.2.5', File::Find::VERSION)
55
+ assert_equal('0.3.0', File::Find::VERSION)
56
56
  end
57
57
 
58
58
  def test_path
@@ -100,6 +100,34 @@ class TC_File_Find < Test::Unit::TestCase
100
100
  assert_nothing_raised{ @rule1.find }
101
101
  end
102
102
 
103
+ def test_find
104
+ assert_kind_of(Array, @rule1.find)
105
+ assert_nil(@rule1.find{})
106
+ end
107
+
108
+ def test_filetest_basic
109
+ assert_respond_to(@rule1, :filetest)
110
+ assert_respond_to(@rule1, :filetest=)
111
+ assert_nothing_raised{ @rule1.filetest }
112
+ assert_kind_of(Array, @rule1.filetest)
113
+ end
114
+
115
+ def test_filetest_valid_options
116
+ assert_nothing_raised{ File::Find.new(:readable? => true) }
117
+ assert_nothing_raised{ File::Find.new(:writable? => true) }
118
+ end
119
+
120
+ def test_filetest
121
+ rule = File::Find.new(:name => "*.doc", :writable? => true)
122
+ File.chmod(0644, @file4)
123
+
124
+ assert_equal([@file4], rule.find.map{ |f| File.basename(f) })
125
+
126
+ File.chmod(0444, @file4)
127
+
128
+ assert_equal([], rule.find)
129
+ end
130
+
103
131
  def test_mtime
104
132
  rule1 = File::Find.new(:name => "*.rb", :mtime => 0)
105
133
  rule2 = File::Find.new(:name => "*.rb", :mtime => 1)
@@ -353,6 +381,7 @@ class TC_File_Find < Test::Unit::TestCase
353
381
  def test_expected_errors
354
382
  assert_raise(Errno::ENOENT){ File::Find.new(:path => '/bogus/dir').find }
355
383
  assert_raise(ArgumentError){ File::Find.new(:bogus => 1) }
384
+ assert_raise(ArgumentError){ File::Find.new(:bogus? => true) }
356
385
  end
357
386
 
358
387
  def teardown
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: file-find
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Berger
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-29 00:00:00 -07:00
12
+ date: 2008-12-30 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency