mockfs 0.1.2 → 0.1.3

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.
@@ -1,48 +1,73 @@
1
+ # Include this file to redefine FileUtils, Dir, and File. The point of this is so that you can use MockFS to test a codebase that calls these classes directly instead of going through MockFS.file_utils, etc.
2
+ #
3
+ # Please note that as of this writing (June 11, 2006), this file is still fairly experimental. Please exercise caution when relying on tests through this.
4
+
1
5
  require 'mockfs'
2
6
 
3
7
  MockFS.mock = true
4
8
 
9
+ MockFS::OriginalFileUtils = FileUtils
5
10
  Object.send( :remove_const, :FileUtils )
6
- module FileUtils
11
+ module FileUtils #:nodoc:
7
12
  def self.method_missing( symbol, *args, &action )
8
- MockFS.file_utils.send( symbol, *args, &action )
13
+ file_utils = MockFS.mock? ? MockFS.file_utils : MockFS::OriginalFileUtils
14
+ file_utils.send( symbol, *args, &action )
9
15
  end
10
16
  end
11
17
 
12
18
  getwd = Dir.getwd
19
+ MockFS::OriginalDir = Dir
13
20
  Object.send( :remove_const, :Dir )
14
- module Dir
21
+ module Dir #:nodoc:
15
22
  def self.method_missing( symbol, *args, &action )
16
- MockFS.dir.send( symbol, *args, &action )
23
+ dir = MockFS.mock? ? MockFS.dir : MockFS::OriginalDir
24
+ dir.send( symbol, *args, &action )
17
25
  end
18
26
  end
19
27
  Dir.module_eval "def self.getwd; '#{ getwd }'; end"
20
28
 
21
29
  $join_method = File.method :join
30
+ $dirname_method = File.method :dirname
22
31
  $file_constants = {}
23
32
  File.constants.map do |const_str|
24
33
  $file_constants[const_str] = File.const_get const_str.to_sym
25
34
  end
35
+ MockFS::OriginalFile = File
26
36
  Object.send( :remove_const, :File )
27
- module File
37
+ module File #:nodoc:
28
38
  $file_constants.each do |const_str, const_val|
29
39
  self.const_set( const_str, const_val )
30
40
  end
31
41
 
42
+ def self.dirname( *args ); $dirname_method.call( *args ); end
43
+
32
44
  def self.join( *args )
33
45
  $join_method.call *args
34
46
  end
35
47
 
36
48
  def self.method_missing( symbol, *args, &action )
37
- MockFS.file.send( symbol, *args, &action )
49
+ file = MockFS.mock? ? MockFS.file : MockFS::OriginalFile
50
+ file.send( symbol, *args, &action )
38
51
  end
39
52
  end
40
53
 
41
54
  $orig_require = Kernel.method :require
55
+
56
+ # mockfs/override.rb overrides Kernel.require to allow you to include Ruby files that are in the mock file system:
57
+ #
58
+ # require 'mockfs/override'
59
+ # MockFS.file.open( 'virtual.rb', 'w' ) do |f|
60
+ # f.puts "puts 'I am a ruby program living in a virtual file'"
61
+ # end
62
+ # require 'virtual.rb'
63
+ # require 'rexml' # real files are still accessible
42
64
  def require( library_name )
43
65
  begin
66
+ MockFS.mock = false
44
67
  super
68
+ MockFS.mock = true
45
69
  rescue LoadError => err
70
+ MockFS.mock = true
46
71
  file = library_name
47
72
  file += '.rb' unless library_name =~ /\.rb$/
48
73
  if File.exist? file
@@ -4,29 +4,55 @@ MockFS.mock = true
4
4
 
5
5
  Object.send( :remove_const, :FileUtils )
6
6
  module FileUtils
7
- def self.method_missing( symbol, *args )
8
- MockFS.file_utils.send( symbol, *args )
7
+ def self.method_missing( symbol, *args, &action )
8
+ MockFS.file_utils.send( symbol, *args, &action )
9
9
  end
10
10
  end
11
11
 
12
12
  getwd = Dir.getwd
13
13
  Object.send( :remove_const, :Dir )
14
14
  module Dir
15
- def self.method_missing( symbol, *args )
16
- MockFS.dir.send( symbol, *args )
15
+ def self.method_missing( symbol, *args, &action )
16
+ MockFS.dir.send( symbol, *args, &action )
17
17
  end
18
18
  end
19
19
  Dir.module_eval "def self.getwd; '#{ getwd }'; end"
20
20
 
21
21
  $join_method = File.method :join
22
+ $dirname_method = File.method :dirname
23
+ $file_constants = {}
24
+ File.constants.map do |const_str|
25
+ $file_constants[const_str] = File.const_get const_str.to_sym
26
+ end
22
27
  Object.send( :remove_const, :File )
23
28
  module File
29
+ $file_constants.each do |const_str, const_val|
30
+ self.const_set( const_str, const_val )
31
+ end
32
+
33
+ def self.dirname( *args ); $dirname_method.call( *args ); end
34
+
24
35
  def self.join( *args )
25
36
  $join_method.call *args
26
37
  end
27
38
 
28
- def self.method_missing( symbol, *args )
29
- MockFS.file.send( symbol, *args )
39
+ def self.method_missing( symbol, *args, &action )
40
+ MockFS.file.send( symbol, *args, &action )
30
41
  end
31
42
  end
32
43
 
44
+ $orig_require = Kernel.method :require
45
+ def require( library_name )
46
+ begin
47
+ super
48
+ rescue LoadError => err
49
+ file = library_name
50
+ file += '.rb' unless library_name =~ /\.rb$/
51
+ if File.exist? file
52
+ contents = File.open( file ) do |f| f.gets( nil ); end
53
+ eval contents
54
+ else
55
+ raise
56
+ end
57
+ end
58
+ end
data/lib/mockfs.rb CHANGED
@@ -94,7 +94,7 @@ require 'fileutils'
94
94
  require 'singleton'
95
95
 
96
96
  module MockFS
97
- Version = '0.1.2'
97
+ Version = '0.1.3'
98
98
 
99
99
  @@mock = false
100
100
 
@@ -118,6 +118,9 @@ module MockFS
118
118
  # +is_mock+ should be a Boolean.
119
119
  def self.mock= ( is_mock ); @@mock = is_mock; end
120
120
 
121
+ # Returns +true+ or +false+ depending on whether MockFS is using the mock file system.
122
+ def self.mock?; @@mock; end
123
+
121
124
  # If we're in mock mode, this will return the MockFileSystem; otherwise it
122
125
  # will raise a RuntimeError.
123
126
  def self.mock_file_system
@@ -141,16 +144,16 @@ module MockFS
141
144
  module Adapter #:nodoc:
142
145
  @@delegated_methods = [ :delete, :entries, :mtime ]
143
146
 
144
- def get_node( nodename ); MockFileSystem.instance.get_node( nodename ); end
145
-
146
147
  def method_missing( sym, *args )
147
148
  if @@delegated_methods.include?( sym )
148
- get_node( args.first ).send( sym )
149
+ node( args.first ).send( sym )
149
150
  else
150
151
  super
151
152
  end
152
153
  end
153
154
 
155
+ def node( nodename ); MockFileSystem.instance.node( nodename ); end
156
+
154
157
  def respond_to?( sym )
155
158
  @@delegated_methods.include?( sym ) ? true : super
156
159
  end
@@ -160,32 +163,99 @@ module MockFS
160
163
  extend Adapter
161
164
  include Adapter
162
165
 
166
+ def self.[]( string ); glob( string, 0 ); end
167
+
168
+ def self.glob( string, flags = 0 )
169
+ DirAdapter.new( '.' ).send( :glob, string, flags ).map { |result|
170
+ Path.new( result )[1..-1]
171
+ }
172
+ end
173
+
163
174
  def self.mkdir( dirname )
164
175
  path = Path.new( dirname ).absolute
165
- get_node( path.parent ).mkdir( path.node )
176
+ node( path.parent ).mkdir( path.node )
177
+ end
178
+
179
+ def self.rmdir( dirname )
180
+ path = Path.new( dirname ).absolute
181
+ node( path ).delete
166
182
  end
167
183
 
184
+ attr_reader :path
185
+
168
186
  def initialize( dirname )
169
- unless get_node( dirname ).class == MockFileSystem::MockDir
187
+ unless node( dirname ).class == MockFileSystem::MockDir
170
188
  raise Errno::ENOTDIR
171
189
  end
172
- @dirname = dirname
190
+ @path = dirname
191
+ end
192
+
193
+ def entries; self.class.entries( @path ); end
194
+
195
+ protected
196
+
197
+ def glob( string, flags = 0 )
198
+ glob_path = Path.new string
199
+ if glob_path.size > 1
200
+ if glob_path.first != '**'
201
+ subdir = DirAdapter.new( File.join( self.path, glob_path.first ) )
202
+ subdir.send( :glob, glob_path[1..-1], flags )
203
+ else
204
+ if glob_path.size > 2 and glob_path[1] == Path.new( path ).last
205
+ glob( glob_path[2..-1], flags )
206
+ else
207
+ if glob_path.size == 2
208
+ matches = match_entries( glob_path[-1], flags )
209
+ else
210
+ matches = []
211
+ end
212
+ DirAdapter.entries( path ).each do |entry|
213
+ unless %w( . .. ).include? entry
214
+ if FileAdapter.directory? File.join( path, entry )
215
+ subdir = DirAdapter.new File.join( self.path, entry )
216
+ matches << subdir.send( :glob, glob_path, flags )
217
+ end
218
+ end
219
+ end
220
+ matches.flatten.uniq
221
+ end
222
+ end
223
+ else
224
+ match_entries( string, flags )
225
+ end
173
226
  end
174
227
 
175
- def entries; self.class.entries( @dirname ); end
228
+ def match_entries( string, flags )
229
+ string = string.gsub( /\./, '\.' )
230
+ string = string.gsub( /\?/, '.' )
231
+ string = string.gsub( /\*/, ".*" )
232
+ string = string.gsub( /\{(.+),(.+)\}/, '(\1|\2)' )
233
+ re = Regexp.new string
234
+ DirAdapter.entries( path ).select { |entry|
235
+ flags & File::FNM_DOTMATCH != 0 || !%w( . .. ).include?( entry )
236
+ }.select { |entry| entry =~ re }.map { |entry| File.join( path, entry ) }
237
+ end
176
238
  end
177
239
 
178
240
  class FileAdapter #:nodoc:
179
241
  extend Adapter
180
242
 
181
243
  def self.chmod( perms, *filenames )
182
- get_node( filenames.first ).permissions = perms
244
+ node( filenames.first ).permissions = perms
245
+ end
246
+
247
+ def self.directory?( file_name )
248
+ begin
249
+ node( file_name ).is_a? MockFileSystem::MockDir
250
+ rescue Errno::ENOENT
251
+ false
252
+ end
183
253
  end
184
254
 
185
255
  class << self
186
256
  def exist?( filename )
187
257
  begin
188
- get_node( filename )
258
+ node( filename )
189
259
  true
190
260
  rescue Errno::ENOENT
191
261
  false
@@ -194,16 +264,24 @@ module MockFS
194
264
 
195
265
  alias_method :exists?, :exist?
196
266
  end
197
-
198
- def self.get_mock_file( fd, mode ) #:nodoc:
267
+
268
+ def self.file?( file_name )
269
+ begin
270
+ node( file_name ).is_a? MockFileSystem::MockFile
271
+ rescue Errno::ENOENT
272
+ false
273
+ end
274
+ end
275
+
276
+ def self.mock_file( fd, mode ) #:nodoc:
199
277
  if mode.read_only?
200
- mock_file = get_node( fd )
278
+ mock_file = node( fd )
201
279
  raise Errno::EACCES if mock_file and !mock_file.readable?
202
280
  else
203
281
  path = Path.new( fd ).absolute
204
- dir = get_node( path.parent )
282
+ dir = node( path.parent )
205
283
  if mode.append?
206
- mock_file = get_node( fd )
284
+ mock_file = node( fd )
207
285
  else
208
286
  mock_file = MockFileSystem::MockFile.new( dir, path.node, '' )
209
287
  end
@@ -213,7 +291,7 @@ module MockFS
213
291
 
214
292
  def self.open( fd, mode_string = File::RDONLY, &action )
215
293
  mode = Mode.new mode_string
216
- mock_file = get_mock_file( fd, mode )
294
+ mock_file = mock_file( fd, mode )
217
295
  mock_file.pos = mock_file.size if mode.append?
218
296
  if action
219
297
  result = action.call( mock_file )
@@ -227,11 +305,21 @@ module MockFS
227
305
  end
228
306
  end
229
307
 
230
- class Mode
308
+ def self.read( name )
309
+ mfile = node name
310
+ raise Errno::EISDIR if mfile.is_a? MockFileSystem::MockDir
311
+ mfile.read
312
+ end
313
+
314
+ class Mode #:nodoc:
231
315
  def initialize( string_or_bitwise )
232
316
  if string_or_bitwise.is_a?( String )
233
317
  if string_or_bitwise == 'w'
234
318
  @bitwise = File::WRONLY
319
+ elsif string_or_bitwise == 'r'
320
+ @bitwise = File::RDONLY
321
+ elsif string_or_bitwise == 'a'
322
+ @bitwise = File::APPEND
235
323
  end
236
324
  else
237
325
  @bitwise = string_or_bitwise
@@ -248,15 +336,15 @@ module MockFS
248
336
  extend Adapter
249
337
 
250
338
  def self.cp( src, dest, options = {} )
251
- file = get_node( src ).clone
339
+ file = node( src ).clone
252
340
  dest_path = Path.new( dest ).absolute
253
341
  if MockFS.file.exist?( dest )
254
- maybe_dest_dir = get_node dest_path
342
+ maybe_dest_dir = node dest_path
255
343
  if maybe_dest_dir.is_a? MockFileSystem::MockDir
256
344
  dest_path << ( '/' + Path.new( src ).absolute.node )
257
345
  end
258
346
  end
259
- dest_dir = get_node dest_path.parent
347
+ dest_dir = node dest_path.parent
260
348
  dest_dir[dest_path.node] = file
261
349
  file.name = dest_path.node
262
350
  file.parent = dest_dir
@@ -273,10 +361,10 @@ module MockFS
273
361
 
274
362
  def self.touch( file )
275
363
  begin
276
- get_node( file ).mtime = Time.now
364
+ node( file ).mtime = Time.now
277
365
  rescue Errno::ENOENT
278
366
  path = Path.new( file ).absolute
279
- parent_dir = get_node( path.parent )
367
+ parent_dir = node( path.parent )
280
368
  file = MockFileSystem::MockFile.new( parent_dir, path.node, nil )
281
369
  parent_dir[path.node] = file
282
370
  end
@@ -297,10 +385,6 @@ module MockFS
297
385
  # Flushes all file information out of the MockFileSystem.
298
386
  def flush; @root = MockRoot.new( '' ); fill_path( '.' ); end
299
387
 
300
- def get_node( dirname ) #:nodoc:
301
- @root.get_node( dirname )
302
- end
303
-
304
388
  # Use this method to fill in directory paths. This is the same as calling mkdir a bunch of times.
305
389
  #
306
390
  # MockFS.mock_file_system.fill_path '/usr/local/bin'
@@ -309,6 +393,10 @@ module MockFS
309
393
  @root.fill_path( Path.new( dirname ).absolute.strip )
310
394
  end
311
395
 
396
+ def node( dirname ) #:nodoc:
397
+ @root.node( dirname )
398
+ end
399
+
312
400
  module Node #:nodoc:
313
401
  attr_accessor :mtime, :name, :parent, :permissions
314
402
 
@@ -337,21 +425,6 @@ module MockFS
337
425
 
338
426
  def entries; %w( . .. ).concat( keys ); end
339
427
 
340
- def get_node( dirname )
341
- if dirname.first == '..'
342
- self.parent.get_node( dirname[1..-1] )
343
- elsif dirname.first == '.'
344
- self.get_node( dirname[1..-1] )
345
- elsif dirname.size > 1
346
- subdir = self[dirname.first]
347
- subdir ? subdir.get_node( dirname[1..-1] ) : ( raise Errno::ENOENT )
348
- elsif dirname == ''
349
- self
350
- else
351
- self[dirname.strip] or ( raise Errno::ENOENT )
352
- end
353
- end
354
-
355
428
  def fill_dir( dirname )
356
429
  dir = self[dirname]
357
430
  if dir.nil?
@@ -376,6 +449,21 @@ module MockFS
376
449
  end
377
450
 
378
451
  def mkdir( dirname ); fill_path( Path.new( dirname ) ); end
452
+
453
+ def node( dirname )
454
+ if dirname.first == '..'
455
+ self.parent.node( dirname[1..-1] )
456
+ elsif dirname.first == '.'
457
+ self.node( dirname[1..-1] )
458
+ elsif dirname.size > 1
459
+ subdir = self[dirname.first]
460
+ subdir ? subdir.node( dirname[1..-1] ) : ( raise Errno::ENOENT )
461
+ elsif dirname == ''
462
+ self
463
+ else
464
+ self[dirname.strip] or ( raise Errno::ENOENT )
465
+ end
466
+ end
379
467
  end
380
468
 
381
469
  class MockFile < DelegateClass( StringIO ) #:nodoc:
@@ -407,7 +495,7 @@ module MockFS
407
495
  end
408
496
 
409
497
  class MockRoot < MockDir #:nodoc:
410
- def get_node( dirname )
498
+ def node( dirname )
411
499
  begin
412
500
  super( Path.new( dirname ).absolute.strip )
413
501
  rescue Errno::ENOENT
@@ -425,7 +513,13 @@ module MockFS
425
513
  @@getwd
426
514
  end
427
515
 
428
- def []( *args ); Path.new( self.split( "/" )[*args].join( "/" ) ); end
516
+ def []( *args )
517
+ if args.size == 1 and args.first.is_a? Fixnum
518
+ Path.new self.split( "/" )[*args]
519
+ else
520
+ Path.new self.split( "/" )[*args].join( "/" )
521
+ end
522
+ end
429
523
 
430
524
  def absolute
431
525
  if self =~ %r{^\w}
@@ -440,14 +534,16 @@ module MockFS
440
534
 
441
535
  def first; self.split( "/" ).first; end
442
536
 
443
- def parent
537
+ def last; self.split( "/" ).last; end
538
+
539
+ def node
444
540
  self =~ %r{^(.*)/(.*?)$}
445
- $1
541
+ $2
446
542
  end
447
543
 
448
- def node
544
+ def parent
449
545
  self =~ %r{^(.*)/(.*?)$}
450
- $2
546
+ $1
451
547
  end
452
548
 
453
549
  def size; self.split( '/' ).size; end
data/lib/mockfs.rb~ CHANGED
@@ -94,7 +94,7 @@ require 'fileutils'
94
94
  require 'singleton'
95
95
 
96
96
  module MockFS
97
- Version = '0.1.1'
97
+ Version = '0.1.2'
98
98
 
99
99
  @@mock = false
100
100
 
@@ -141,16 +141,16 @@ module MockFS
141
141
  module Adapter #:nodoc:
142
142
  @@delegated_methods = [ :delete, :entries, :mtime ]
143
143
 
144
- def get_node( nodename ); MockFileSystem.instance.get_node( nodename ); end
145
-
146
144
  def method_missing( sym, *args )
147
145
  if @@delegated_methods.include?( sym )
148
- get_node( args.first ).send( sym )
146
+ node( args.first ).send( sym )
149
147
  else
150
148
  super
151
149
  end
152
150
  end
153
151
 
152
+ def node( nodename ); MockFileSystem.instance.node( nodename ); end
153
+
154
154
  def respond_to?( sym )
155
155
  @@delegated_methods.include?( sym ) ? true : super
156
156
  end
@@ -160,32 +160,69 @@ module MockFS
160
160
  extend Adapter
161
161
  include Adapter
162
162
 
163
+ def self.[]( string ); glob( string, 0 ); end
164
+
165
+ def self.glob( string, flags = 0 )
166
+ self.new( '.' ).send( :glob, string, flags )
167
+ end
168
+
163
169
  def self.mkdir( dirname )
164
170
  path = Path.new( dirname ).absolute
165
- get_node( path.parent ).mkdir( path.node )
171
+ node( path.parent ).mkdir( path.node )
172
+ end
173
+
174
+ def self.rmdir( dirname )
175
+ path = Path.new( dirname ).absolute
176
+ node( path ).delete
166
177
  end
167
178
 
168
179
  def initialize( dirname )
169
- unless get_node( dirname ).class == MockFileSystem::MockDir
180
+ unless node( dirname ).class == MockFileSystem::MockDir
170
181
  raise Errno::ENOTDIR
171
182
  end
172
183
  @dirname = dirname
173
184
  end
174
185
 
175
186
  def entries; self.class.entries( @dirname ); end
187
+
188
+ private
189
+
190
+ def glob( string, flags = 0 )
191
+ path = Path.new string
192
+ string = path.node
193
+ string = string.gsub( /\./, '\.' )
194
+ string = string.gsub( /\?/, '.' )
195
+ string = string.gsub( /\*/, ".*" )
196
+ string = string.gsub( /\{(.+),(.+)\}/, '(\1|\2)' )
197
+ puts " #{ string }"
198
+ re = Regexp.new string
199
+ entries( path.parent ).select { |entry|
200
+ flags & File::FNM_DOTMATCH != 0 || !%w( . .. ).include?( entry )
201
+ }.select { |entry| entry =~ re }.map { |entry|
202
+ File.join( path.parent, entry )
203
+ }
204
+ end
176
205
  end
177
206
 
178
207
  class FileAdapter #:nodoc:
179
208
  extend Adapter
180
209
 
181
210
  def self.chmod( perms, *filenames )
182
- get_node( filenames.first ).permissions = perms
211
+ node( filenames.first ).permissions = perms
212
+ end
213
+
214
+ def self.directory?( file_name )
215
+ begin
216
+ node( file_name ).is_a? MockFileSystem::MockDir
217
+ rescue Errno::ENOENT
218
+ false
219
+ end
183
220
  end
184
221
 
185
222
  class << self
186
223
  def exist?( filename )
187
224
  begin
188
- get_node( filename )
225
+ node( filename )
189
226
  true
190
227
  rescue Errno::ENOENT
191
228
  false
@@ -194,16 +231,24 @@ module MockFS
194
231
 
195
232
  alias_method :exists?, :exist?
196
233
  end
197
-
198
- def self.get_mock_file( fd, mode ) #:nodoc:
234
+
235
+ def self.file?( file_name )
236
+ begin
237
+ node( file_name ).is_a? MockFileSystem::MockFile
238
+ rescue Errno::ENOENT
239
+ false
240
+ end
241
+ end
242
+
243
+ def self.mock_file( fd, mode ) #:nodoc:
199
244
  if mode.read_only?
200
- mock_file = get_node( fd )
245
+ mock_file = node( fd )
201
246
  raise Errno::EACCES if mock_file and !mock_file.readable?
202
247
  else
203
248
  path = Path.new( fd ).absolute
204
- dir = get_node( path.parent )
249
+ dir = node( path.parent )
205
250
  if mode.append?
206
- mock_file = get_node( fd )
251
+ mock_file = node( fd )
207
252
  else
208
253
  mock_file = MockFileSystem::MockFile.new( dir, path.node, '' )
209
254
  end
@@ -213,7 +258,7 @@ module MockFS
213
258
 
214
259
  def self.open( fd, mode_string = File::RDONLY, &action )
215
260
  mode = Mode.new mode_string
216
- mock_file = get_mock_file( fd, mode )
261
+ mock_file = mock_file( fd, mode )
217
262
  mock_file.pos = mock_file.size if mode.append?
218
263
  if action
219
264
  result = action.call( mock_file )
@@ -227,11 +272,21 @@ module MockFS
227
272
  end
228
273
  end
229
274
 
275
+ def self.read( name )
276
+ mfile = node name
277
+ raise Errno::EISDIR if mfile.is_a? MockFileSystem::MockDir
278
+ mfile.read
279
+ end
280
+
230
281
  class Mode
231
282
  def initialize( string_or_bitwise )
232
283
  if string_or_bitwise.is_a?( String )
233
284
  if string_or_bitwise == 'w'
234
285
  @bitwise = File::WRONLY
286
+ elsif string_or_bitwise == 'r'
287
+ @bitwise = File::RDONLY
288
+ elsif string_or_bitwise == 'a'
289
+ @bitwise = File::APPEND
235
290
  end
236
291
  else
237
292
  @bitwise = string_or_bitwise
@@ -248,15 +303,15 @@ module MockFS
248
303
  extend Adapter
249
304
 
250
305
  def self.cp( src, dest, options = {} )
251
- file = get_node( src ).clone
306
+ file = node( src ).clone
252
307
  dest_path = Path.new( dest ).absolute
253
308
  if MockFS.file.exist?( dest )
254
- maybe_dest_dir = get_node dest_path
309
+ maybe_dest_dir = node dest_path
255
310
  if maybe_dest_dir.is_a? MockFileSystem::MockDir
256
311
  dest_path << ( '/' + Path.new( src ).absolute.node )
257
312
  end
258
313
  end
259
- dest_dir = get_node dest_path.parent
314
+ dest_dir = node dest_path.parent
260
315
  dest_dir[dest_path.node] = file
261
316
  file.name = dest_path.node
262
317
  file.parent = dest_dir
@@ -273,10 +328,10 @@ module MockFS
273
328
 
274
329
  def self.touch( file )
275
330
  begin
276
- get_node( file ).mtime = Time.now
331
+ node( file ).mtime = Time.now
277
332
  rescue Errno::ENOENT
278
333
  path = Path.new( file ).absolute
279
- parent_dir = get_node( path.parent )
334
+ parent_dir = node( path.parent )
280
335
  file = MockFileSystem::MockFile.new( parent_dir, path.node, nil )
281
336
  parent_dir[path.node] = file
282
337
  end
@@ -297,10 +352,6 @@ module MockFS
297
352
  # Flushes all file information out of the MockFileSystem.
298
353
  def flush; @root = MockRoot.new( '' ); fill_path( '.' ); end
299
354
 
300
- def get_node( dirname ) #:nodoc:
301
- @root.get_node( dirname )
302
- end
303
-
304
355
  # Use this method to fill in directory paths. This is the same as calling mkdir a bunch of times.
305
356
  #
306
357
  # MockFS.mock_file_system.fill_path '/usr/local/bin'
@@ -309,6 +360,10 @@ module MockFS
309
360
  @root.fill_path( Path.new( dirname ).absolute.strip )
310
361
  end
311
362
 
363
+ def node( dirname ) #:nodoc:
364
+ @root.node( dirname )
365
+ end
366
+
312
367
  module Node #:nodoc:
313
368
  attr_accessor :mtime, :name, :parent, :permissions
314
369
 
@@ -337,21 +392,6 @@ module MockFS
337
392
 
338
393
  def entries; %w( . .. ).concat( keys ); end
339
394
 
340
- def get_node( dirname )
341
- if dirname.first == '..'
342
- self.parent.get_node( dirname[1..-1] )
343
- elsif dirname.first == '.'
344
- self.get_node( dirname[1..-1] )
345
- elsif dirname.size > 1
346
- subdir = self[dirname.first]
347
- subdir ? subdir.get_node( dirname[1..-1] ) : ( raise Errno::ENOENT )
348
- elsif dirname == ''
349
- self
350
- else
351
- self[dirname.strip] or ( raise Errno::ENOENT )
352
- end
353
- end
354
-
355
395
  def fill_dir( dirname )
356
396
  dir = self[dirname]
357
397
  if dir.nil?
@@ -376,6 +416,21 @@ module MockFS
376
416
  end
377
417
 
378
418
  def mkdir( dirname ); fill_path( Path.new( dirname ) ); end
419
+
420
+ def node( dirname )
421
+ if dirname.first == '..'
422
+ self.parent.node( dirname[1..-1] )
423
+ elsif dirname.first == '.'
424
+ self.node( dirname[1..-1] )
425
+ elsif dirname.size > 1
426
+ subdir = self[dirname.first]
427
+ subdir ? subdir.node( dirname[1..-1] ) : ( raise Errno::ENOENT )
428
+ elsif dirname == ''
429
+ self
430
+ else
431
+ self[dirname.strip] or ( raise Errno::ENOENT )
432
+ end
433
+ end
379
434
  end
380
435
 
381
436
  class MockFile < DelegateClass( StringIO ) #:nodoc:
@@ -407,7 +462,7 @@ module MockFS
407
462
  end
408
463
 
409
464
  class MockRoot < MockDir #:nodoc:
410
- def get_node( dirname )
465
+ def node( dirname )
411
466
  begin
412
467
  super( Path.new( dirname ).absolute.strip )
413
468
  rescue Errno::ENOENT
@@ -440,14 +495,14 @@ module MockFS
440
495
 
441
496
  def first; self.split( "/" ).first; end
442
497
 
443
- def parent
498
+ def node
444
499
  self =~ %r{^(.*)/(.*?)$}
445
- $1
500
+ $2
446
501
  end
447
502
 
448
- def node
503
+ def parent
449
504
  self =~ %r{^(.*)/(.*?)$}
450
- $2
505
+ $1
451
506
  end
452
507
 
453
508
  def size; self.split( '/' ).size; end
metadata CHANGED
@@ -1,53 +1,58 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.6
2
+ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: mockfs
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.2
7
- date: 2005-09-19
6
+ version: 0.1.3
7
+ date: 2006-06-11 00:00:00 -04:00
8
8
  summary: MockFS is a test-obsessed library for mocking out the entire file system.
9
9
  require_paths:
10
- - lib
10
+ - lib
11
11
  email: sera@fhwang.net
12
12
  homepage: http://mockfs.rubyforge.org/
13
13
  rubyforge_project:
14
- description: "MockFS is a test-obsessed library for mocking out the entire file system. It
15
- provides mock objects that clone the functionality of File, FileUtils, Dir, and
16
- other in-Ruby file-access libraries."
14
+ description: MockFS is a test-obsessed library for mocking out the entire file system. It provides mock objects that clone the functionality of File, FileUtils, Dir, and other in-Ruby file-access libraries.
17
15
  autorequire: mockfs
18
16
  default_executable:
19
17
  bindir: bin
20
- has_rdoc: false
18
+ has_rdoc: true
21
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
22
20
  requirements:
23
- -
24
- - ">"
25
- - !ruby/object:Gem::Version
26
- version: 0.0.0
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
27
24
  version:
28
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
29
28
  authors:
30
- - Francis Hwang
29
+ - Francis Hwang
31
30
  files:
32
- - lib/mockfs
33
- - lib/mockfs.rb
34
- - lib/mockfs.rb~
35
- - lib/mockfs/override.rb
36
- - lib/mockfs/override.rb~
31
+ - lib/mockfs
32
+ - lib/mockfs.rb
33
+ - lib/mockfs.rb~
34
+ - lib/mockfs/override.rb
35
+ - lib/mockfs/override.rb~
37
36
  test_files: []
38
- rdoc_options: []
37
+
38
+ rdoc_options:
39
+ - --main
40
+ - lib/mockfs.rb
39
41
  extra_rdoc_files: []
42
+
40
43
  executables: []
44
+
41
45
  extensions: []
46
+
42
47
  requirements: []
48
+
43
49
  dependencies:
44
- - !ruby/object:Gem::Dependency
45
- name: extensions
46
- version_requirement:
47
- version_requirements: !ruby/object:Gem::Version::Requirement
48
- requirements:
49
- -
50
- - ">"
51
- - !ruby/object:Gem::Version
52
- version: 0.0.0
53
- version:
50
+ - !ruby/object:Gem::Dependency
51
+ name: extensions
52
+ version_requirement:
53
+ version_requirements: !ruby/object:Gem::Version::Requirement
54
+ requirements:
55
+ - - ">"
56
+ - !ruby/object:Gem::Version
57
+ version: 0.0.0
58
+ version: