file-find 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGES CHANGED
@@ -1,3 +1,12 @@
1
+ == 0.2.2 - 19-Nov-2008
2
+ * The :user and :group options now accept a name or a numeric id. Thanks go
3
+ to Bill Kleb for the suggestion.
4
+ * Fixed yet another path bug for MS Windows.
5
+ * Updated platform check to use CONFIG instead of RUBY_PLATFORM, because the
6
+ latter does not work as I intended with other implementations, e.g. JRuby.
7
+ * Added sys-admin and test-unit as prerequisites.
8
+ * Added tests for the :user and :group options.
9
+
1
10
  == 0.2.1 - 4-Oct-2007
2
11
  * Added the File::Find#previous method, which lets you see the previous
3
12
  match, if any.
data/README CHANGED
@@ -49,8 +49,10 @@ http://www.rubyforge.org/projects/shards.
49
49
 
50
50
  Some specific things I plan on adding:
51
51
 
52
+ * symbolic permissions for the :perm option
52
53
  * exec
53
54
  * links
55
+ * support for :user and :group on MS Windows
54
56
 
55
57
  = Options I won't support
56
58
  Generally speaking, anything that would require mucking around with C code
@@ -79,6 +81,10 @@ The 'perm' option does not work on MS Windows, even for its limited subset of
79
81
  permissions, i.e. 664 and 666. This is arguably a bug in Ruby's
80
82
  File::Stat.mode method on MS Windows.
81
83
 
84
+ The 'user' and 'group' options are not currently supported on MS Windows.
85
+ This can be supported, but will require changes in the win32-file and
86
+ win32-file-stat libraries (which would then become dependencies).
87
+
82
88
  = Bugs
83
89
  None that I'm aware of. Please log any bug reports on the project page at
84
90
  http://www.rubyforge.org/projects/shards.
@@ -91,7 +97,7 @@ http://www.rubyforge.org/projects/shards.
91
97
  Ruby's
92
98
 
93
99
  = Copyright
94
- (C) 2007, Daniel J. Berger, All Rights Reserved
100
+ (C) 2007-2008, Daniel J. Berger, All Rights Reserved
95
101
 
96
102
  = Author
97
103
  Daniel J. Berger
@@ -1,8 +1,12 @@
1
1
  require 'date'
2
+ require 'rbconfig'
3
+ require 'sys/admin'
4
+ include Config
5
+ include Sys
2
6
 
3
7
  class File::Find
4
- # The version of this package
5
- VERSION = '0.2.1'
8
+ # The version of this library
9
+ VERSION = '0.2.2'
6
10
 
7
11
  # :stopdoc:
8
12
  VALID_OPTIONS = %w/
@@ -45,7 +49,10 @@ class File::Find
45
49
  #
46
50
  attr_accessor :ctime
47
51
 
48
- # Limits searches to files that belong to a specific group ID.
52
+ # Limits searches to files that belong to a specific group, where the
53
+ # group can be either a group name or ID.
54
+ #
55
+ # Not currently supported on MS Windows.
49
56
  #
50
57
  attr_accessor :group
51
58
 
@@ -74,6 +81,8 @@ class File::Find
74
81
  # group, and world settings are used. Do not use a leading 0 in the values
75
82
  # that you supply, e.g. use 755 not 0755.
76
83
  #
84
+ # Not currently supported on MS Windows.
85
+ #
77
86
  attr_accessor :perm
78
87
 
79
88
  # Skips files or directories that match the string provided as an argument.
@@ -87,7 +96,10 @@ class File::Find
87
96
  #
88
97
  attr_accessor :size
89
98
 
90
- # Limits searches to files that belong to a specific user ID.
99
+ # Limits searches to files that belong to a specific user, where the user
100
+ # can be either a user name or an ID.
101
+ #
102
+ # Not currently supported on MS Windows.
91
103
  #
92
104
  attr_accessor :user
93
105
 
@@ -102,6 +114,14 @@ class File::Find
102
114
  # object serve as the rules for determining what files the File::Find#find
103
115
  # method will search for.
104
116
  #
117
+ # Example:
118
+ #
119
+ # rule = File::Find.new(
120
+ # :name => "*.rb",
121
+ # :follow => false,
122
+ # :path => ['/usr/local/lib', '/opt/local/lib']
123
+ # )
124
+ #
105
125
  def initialize(options = {})
106
126
  @options = options
107
127
 
@@ -128,6 +148,18 @@ class File::Find
128
148
  # In block form, yields each file in turn that matches the specified rules.
129
149
  # In non-block form it will return an array of matches instead.
130
150
  #
151
+ # Example:
152
+ #
153
+ # rule = File::Find.new(
154
+ # :name => "*.rb",
155
+ # :follow => false,
156
+ # :path => ['/usr/local/lib', '/opt/local/lib']
157
+ # )
158
+ #
159
+ # rule.find{ |f|
160
+ # puts f
161
+ # }
162
+ #
131
163
  def find
132
164
  results = [] unless block_given?
133
165
  paths = @path.to_a
@@ -179,6 +211,7 @@ class File::Find
179
211
  # Dir[] doesn't like backslashes
180
212
  if File::ALT_SEPARATOR
181
213
  file.tr!(File::ALT_SEPARATOR, File::SEPARATOR)
214
+ glob.tr!(File::ALT_SEPARATOR, File::SEPARATOR)
182
215
  end
183
216
 
184
217
  next unless Dir[glob].include?(file)
@@ -200,10 +233,14 @@ class File::Find
200
233
  end
201
234
 
202
235
  if @group
203
- next unless stat_info.gid == @group
236
+ if @group.is_a?(String)
237
+ next unless Admin.get_group(stat_info.gid).name == @group
238
+ else
239
+ next unless stat_info.gid == @group
240
+ end
204
241
  end
205
242
 
206
- unless RUBY_PLATFORM.match('mswin')
243
+ unless CONFIG['host_os'] =~ /windows|mswin/i
207
244
  if @inum
208
245
  next unless stat_info.ino == @inum
209
246
  end
@@ -237,7 +274,11 @@ class File::Find
237
274
  end
238
275
 
239
276
  if @user
240
- next unless stat_info.uid == @user
277
+ if @user.is_a?(String)
278
+ next unless Admin.get_user(stat_info.uid).name == @user
279
+ else
280
+ next unless stat_info.uid == @user
281
+ end
241
282
  end
242
283
 
243
284
  if block_given?
@@ -1,28 +1,41 @@
1
1
  ######################################################################
2
- # tc_find.rb
2
+ # test_file_find.rb
3
3
  #
4
4
  # Test case for the File::Find package. You should run this via the
5
5
  # 'rake test' task.
6
6
  ######################################################################
7
+ require 'rubygems'
8
+ gem 'test-unit'
9
+
7
10
  require 'test/unit'
8
11
  require 'fileutils'
9
12
  require 'file/find'
13
+ require 'rbconfig'
14
+ require 'sys/admin'
15
+ include Config
10
16
 
11
17
  class TC_File_Find < Test::Unit::TestCase
12
- WINDOWS = RUBY_PLATFORM.match('mswin') ? true : false
18
+ def self.startup
19
+ Dir.chdir('test') unless File.basename(Dir.pwd) == 'test'
20
+ @@windows = CONFIG['host_os'] =~ /windows|mswin/i
21
+ @@loguser = Sys::Admin.get_user(Admin.get_login) unless @@windows
22
+ @@logroup = Sys::Admin.get_group(@@loguser.gid) unless @@windows
23
+ end
13
24
 
14
25
  def setup
15
26
  @file1 = 'test1.rb'
16
27
  @file2 = 'test1.txt'
17
28
  @file3 = 'foo.txt'
29
+ @file4 = 'foo.doc'
18
30
  @dir1 = 'dir1'
19
31
  @dir2 = 'dir2'
20
32
 
21
33
  File.open(@file1, 'w'){}
22
34
  File.open(@file2, 'w'){}
23
35
  File.open(@file3, 'w'){}
36
+ File.open(@file4, 'w'){}
24
37
 
25
- unless WINDOWS
38
+ unless @@windows
26
39
  @link1 = 'link1'
27
40
  File.symlink(@file1, @link1)
28
41
  end
@@ -33,11 +46,12 @@ class TC_File_Find < Test::Unit::TestCase
33
46
  File.open(File.join(@dir1, 'bar.txt'), 'w'){}
34
47
  File.open(File.join(@dir2, 'baz.txt'), 'w'){}
35
48
 
36
- @rule1 = File::Find.new(:name => '*.rb')
49
+ @rule1 = File::Find.new(:name => '*.txt')
50
+ @rule2 = File::Find.new
37
51
  end
38
52
 
39
53
  def test_version
40
- assert_equal('0.2.1', File::Find::VERSION)
54
+ assert_equal('0.2.2', File::Find::VERSION)
41
55
  end
42
56
 
43
57
  def test_path
@@ -49,7 +63,7 @@ class TC_File_Find < Test::Unit::TestCase
49
63
  def test_options
50
64
  assert_respond_to(@rule1, :options)
51
65
  assert_respond_to(@rule1, :options=)
52
- assert_equal({:name => '*.rb'}, @rule1.options)
66
+ assert_equal({:name => '*.txt'}, @rule1.options)
53
67
  end
54
68
 
55
69
  def test_atime_basic
@@ -100,6 +114,26 @@ class TC_File_Find < Test::Unit::TestCase
100
114
  assert_nil(@rule1.group)
101
115
  end
102
116
 
117
+ def test_group_with_numeric_id
118
+ omit_if(@@windows, 'group test skipped on MS Windows')
119
+ @rule1 = File::Find.new(:name => '*.doc', :group => @@loguser.gid)
120
+ assert_equal([File.expand_path(@file4)], @rule1.find)
121
+ end
122
+
123
+ def test_group_with_string
124
+ omit_if(@@windows, 'group test skipped on MS Windows')
125
+ @rule1 = File::Find.new(:name => '*.doc', :group => @@logroup.name)
126
+ assert_equal([File.expand_path(@file4)], @rule1.find)
127
+ end
128
+
129
+ def test_group_with_bad_id
130
+ omit_if(@@windows, 'group test skipped on MS Windows')
131
+ @rule1 = File::Find.new(:name => '*.doc', :group => 'totallybogus')
132
+ @rule2 = File::Find.new(:name => '*.doc', :group => 99999999)
133
+ assert_equal([], @rule1.find)
134
+ assert_equal([], @rule2.find)
135
+ end
136
+
103
137
  def test_inum_basic
104
138
  assert_respond_to(@rule1, :inum)
105
139
  assert_respond_to(@rule1, :inum=)
@@ -115,13 +149,14 @@ class TC_File_Find < Test::Unit::TestCase
115
149
  def test_name_basic
116
150
  assert_respond_to(@rule1, :name)
117
151
  assert_respond_to(@rule1, :name=)
118
- assert_equal('*.rb', @rule1.name)
152
+ assert_equal('*.txt', @rule1.name)
119
153
  end
120
154
 
121
155
  def test_pattern_alias
122
156
  assert_respond_to(@rule1, :pattern)
123
157
  assert_respond_to(@rule1, :pattern=)
124
- assert_equal('*.rb', @rule1.pattern)
158
+ assert_true(@rule1.method(:name) == @rule1.method(:pattern))
159
+ assert_true(@rule1.method(:name=) == @rule1.method(:pattern=))
125
160
  end
126
161
 
127
162
  def test_perm_basic
@@ -130,16 +165,14 @@ class TC_File_Find < Test::Unit::TestCase
130
165
  assert_nil(@rule1.perm)
131
166
  end
132
167
 
133
- # Skip on MS Windows for now
134
- unless WINDOWS
135
- def test_perm
136
- File.chmod(0664, @file1)
137
- File.chmod(0644, @file2)
138
- results = File::Find.new(:name => "test1*", :perm => 664).find
168
+ def test_perm
169
+ omit_if(@@windows, 'perm test skipped on MS Windows')
170
+ File.chmod(0664, @file1)
171
+ File.chmod(0644, @file2)
172
+ results = File::Find.new(:name => "test1*", :perm => 664).find
139
173
 
140
- assert_equal(1, results.length)
141
- assert_equal('test1.rb', File.basename(results.first))
142
- end
174
+ assert_equal(1, results.length)
175
+ assert_equal('test1.rb', File.basename(results.first))
143
176
  end
144
177
 
145
178
  def test_prune_basic
@@ -165,6 +198,26 @@ class TC_File_Find < Test::Unit::TestCase
165
198
  assert_nil(@rule1.user)
166
199
  end
167
200
 
201
+ def test_user_with_numeric_id
202
+ omit_if(@@windows, 'user test skipped on MS Windows')
203
+ @rule1 = File::Find.new(:name => '*.doc', :user => @@loguser.uid)
204
+ assert_equal([File.expand_path(@file4)], @rule1.find)
205
+ end
206
+
207
+ def test_user_with_string
208
+ omit_if(@@windows, 'user test skipped on MS Windows')
209
+ @rule1 = File::Find.new(:name => '*.doc', :user => @@loguser.name)
210
+ assert_equal([File.expand_path(@file4)], @rule1.find)
211
+ end
212
+
213
+ def test_user_with_bad_id
214
+ omit_if(@@windows, 'user test skipped on MS Windows')
215
+ @rule1 = File::Find.new(:name => '*.doc', :user => 'totallybogus')
216
+ @rule2 = File::Find.new(:name => '*.doc', :user => 99999999)
217
+ assert_equal([], @rule1.find)
218
+ assert_equal([], @rule2.find)
219
+ end
220
+
168
221
  def test_previous_basic
169
222
  assert_respond_to(@rule1, :previous)
170
223
  end
@@ -177,8 +230,22 @@ class TC_File_Find < Test::Unit::TestCase
177
230
  FileUtils.rm_rf(@file1)
178
231
  FileUtils.rm_rf(@file2)
179
232
  FileUtils.rm_rf(@file3)
233
+ FileUtils.rm_rf(@file4)
180
234
  FileUtils.rm_rf(@dir1)
181
235
  FileUtils.rm_rf(@dir2)
182
- FileUtils.rm_rf(@link1) unless WINDOWS
236
+ FileUtils.rm_rf(@link1) unless @@windows
237
+
238
+ @rule1 = nil
239
+ @rule2 = nil
240
+ @file1 = nil
241
+ @file2 = nil
242
+ @file3 = nil
243
+ @file4 = nil
244
+ end
245
+
246
+ def self.shutdown
247
+ @@windows = nil
248
+ @@loguser = nil unless @@windows
249
+ @@logroup = nil unless @@windows
183
250
  end
184
251
  end
metadata CHANGED
@@ -1,53 +1,79 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: file-find
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.2.1
7
- date: 2007-10-05 00:00:00 -06:00
8
- summary: A better way to find files
9
- require_paths:
10
- - lib
11
- email: djberg96@gmail.com
12
- homepage: http://www.rubyforge.org/projects/shards
13
- rubyforge_project:
14
- description: A better way to find files
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.2.2
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Daniel Berger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-11-19 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sys-admin
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.4.4
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: test-unit
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.1
34
+ version:
35
+ description: A better way to find files
36
+ email: djberg96@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README
43
+ - CHANGES
44
+ - MANIFEST
31
45
  files:
32
46
  - lib/file
33
47
  - lib/file/find.rb
34
- - test/tc_find.rb
48
+ - test/test_file_find.rb
35
49
  - README
36
50
  - CHANGES
37
51
  - MANIFEST
38
- test_files:
39
- - test/tc_find.rb
52
+ has_rdoc: true
53
+ homepage: http://www.rubyforge.org/projects/shards
54
+ post_install_message:
40
55
  rdoc_options: []
41
56
 
42
- extra_rdoc_files:
43
- - README
44
- - CHANGES
45
- - MANIFEST
46
- executables: []
47
-
48
- extensions: []
49
-
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
50
71
  requirements: []
51
72
 
52
- dependencies: []
53
-
73
+ rubyforge_project:
74
+ rubygems_version: 1.2.0
75
+ signing_key:
76
+ specification_version: 2
77
+ summary: A better way to find files
78
+ test_files:
79
+ - test/test_file_find.rb