mockfs 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,55 @@
1
+ require 'mockfs'
2
+
3
+ MockFS.mock = true
4
+
5
+ Object.send( :remove_const, :FileUtils )
6
+ module FileUtils
7
+ def self.method_missing( symbol, *args, &action )
8
+ MockFS.file_utils.send( symbol, *args, &action )
9
+ end
10
+ end
11
+
12
+ getwd = Dir.getwd
13
+ Object.send( :remove_const, :Dir )
14
+ module Dir
15
+ def self.method_missing( symbol, *args, &action )
16
+ MockFS.dir.send( symbol, *args, &action )
17
+ end
18
+ end
19
+ Dir.module_eval "def self.getwd; '#{ getwd }'; end"
20
+
21
+ $join_method = File.method :join
22
+ $file_constants = {}
23
+ File.constants.map do |const_str|
24
+ $file_constants[const_str] = File.const_get const_str.to_sym
25
+ end
26
+ Object.send( :remove_const, :File )
27
+ module File
28
+ $file_constants.each do |const_str, const_val|
29
+ self.const_set( const_str, const_val )
30
+ end
31
+
32
+ def self.join( *args )
33
+ $join_method.call *args
34
+ end
35
+
36
+ def self.method_missing( symbol, *args, &action )
37
+ MockFS.file.send( symbol, *args, &action )
38
+ end
39
+ end
40
+
41
+ $orig_require = Kernel.method :require
42
+ def require( library_name )
43
+ begin
44
+ super
45
+ rescue LoadError => err
46
+ file = library_name
47
+ file += '.rb' unless library_name =~ /\.rb$/
48
+ if File.exist? file
49
+ contents = File.open( file ) do |f| f.gets( nil ); end
50
+ eval contents
51
+ else
52
+ raise
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,32 @@
1
+ require 'mockfs'
2
+
3
+ MockFS.mock = true
4
+
5
+ Object.send( :remove_const, :FileUtils )
6
+ module FileUtils
7
+ def self.method_missing( symbol, *args )
8
+ MockFS.file_utils.send( symbol, *args )
9
+ end
10
+ end
11
+
12
+ getwd = Dir.getwd
13
+ Object.send( :remove_const, :Dir )
14
+ module Dir
15
+ def self.method_missing( symbol, *args )
16
+ MockFS.dir.send( symbol, *args )
17
+ end
18
+ end
19
+ Dir.module_eval "def self.getwd; '#{ getwd }'; end"
20
+
21
+ $join_method = File.method :join
22
+ Object.send( :remove_const, :File )
23
+ module File
24
+ def self.join( *args )
25
+ $join_method.call *args
26
+ end
27
+
28
+ def self.method_missing( symbol, *args )
29
+ MockFS.file.send( symbol, *args )
30
+ end
31
+ end
32
+
data/lib/mockfs.rb CHANGED
@@ -2,12 +2,12 @@
2
2
  # It provides mock objects that clone the functionality of File, FileUtils,
3
3
  # Dir, and other in-Ruby file-access libraries.
4
4
  #
5
- # To use MockFS in your production code, call MockFS.get_[ class ].
5
+ # To use MockFS in your production code, call MockFS.[ class ].
6
6
  #
7
- # MockFS.get_file => File
8
- # MockFS.get_file_utils => FileUtils
9
- # MockFS.get_dir => Dir
10
- # MockFS.get_dir.entries( '.' ) => [".", "..", ...]
7
+ # MockFS.file => File
8
+ # MockFS.file_utils => FileUtils
9
+ # MockFS.dir => Dir
10
+ # MockFS.dir.entries( '.' ) => [".", "..", ...]
11
11
  #
12
12
  # Then, to turn these into mock instances for a test case, simply call
13
13
  #
@@ -16,14 +16,75 @@
16
16
  # When you've done this, the normal calls will actually return adapters that
17
17
  # pretend to be the class in question:
18
18
  #
19
- # MockFS.get_file => MockFS::FileAdapter
20
- # MockFS.get_file_utils => MockFS::FileUtilsAdapter
21
- # MockFS.get_dir => MockFS::DirAdapter
22
- # MockFS.get_dir.entries( '.' ) => [".", "..", ...]
19
+ # MockFS.file => MockFS::FileAdapter
20
+ # MockFS.file_utils => MockFS::FileUtilsAdapter
21
+ # MockFS.dir => MockFS::DirAdapter
22
+ # MockFS.dir.entries( '.' ) => [".", "..", ...]
23
23
  #
24
24
  # You can get direct access to the enclosed MockFileSystem by calling
25
25
  # MockFS.mock_file_system.
26
26
  #
27
+ # == Testing example
28
+ #
29
+ # For example, let's test a simple function that moves a log file into
30
+ # somebody's home directory.
31
+ #
32
+ # require 'mockfs'
33
+ #
34
+ # def move_log
35
+ # MockFS.file_utils.mv( '/var/log/httpd/access_log', '/home/francis/logs/' )
36
+ # end
37
+ #
38
+ # A test of this functionality might look like this:
39
+ #
40
+ # require 'test/unit'
41
+ #
42
+ # class TestMoveLog < Test::Unit::TestCase
43
+ # def test_move_log
44
+ # # Set MockFS to use the mock file system
45
+ # MockFS.mock = true
46
+ #
47
+ # # Fill certain directories
48
+ # MockFS.fill_path '/var/log/httpd/'
49
+ # MockFS.fill_path '/home/francis/logs/'
50
+ #
51
+ # # Create the access log
52
+ # MockFS.file.open( '/var/log/httpd/access_log', File::CREAT ) do |f|
53
+ # f.puts "line 1 of the access log"
54
+ # end
55
+ #
56
+ # # Run the method
57
+ # move_log
58
+ #
59
+ # # Test that it was moved, along with its contents
60
+ # assert( MockFS.file.exist?( '/home/francis/logs/access_log' ) )
61
+ # assert( !MockFS.file.exist?( '/var/log/httpd/access_log' ) )
62
+ # contents = MockFS.file.open( '/home/francis/logs/access_log' ) do |f|
63
+ # f.gets( nil )
64
+ # end
65
+ # assert_equal( "line 1 of the access log\n", contents )
66
+ # end
67
+ # end
68
+ #
69
+ # This test will be successful, and it won't litter your real file-system with
70
+ # testing files.
71
+ #
72
+ # == override.rb
73
+ #
74
+ # Reading the testing example above, you may be struck by one thing: Using
75
+ # MockFS requires you to remember to reference it everywhere, making calls such
76
+ # as MockFS.file_utils.mv instead of just FileUtils.mv. As another option, you
77
+ # can use File, FileUtils, and Dir directly, and then in your tests, substitute
78
+ # them by including mockfs/override.rb. I'd recommend using these with caution;
79
+ # substituting these low-level classes can have unpredictable results.
80
+ #
81
+ # Including override.rb also allows Kernel.require to look in your
82
+ # mock file system for mock Ruby files to include. You might find this useful
83
+ # if you have configuration files written in Ruby, and you'd like to swap them
84
+ # out for tests. This is pretty experimental, too.
85
+ #
86
+ # == Project page
87
+ #
27
88
  # You can view the Rubyforge project page at
28
89
  # http://rubyforge.org/projects/mockfs.
29
90
 
@@ -33,30 +94,23 @@ require 'fileutils'
33
94
  require 'singleton'
34
95
 
35
96
  module MockFS
36
- Version = '0.1.1'
97
+ Version = '0.1.2'
37
98
 
38
99
  @@mock = false
39
100
 
40
101
  def self.method_missing( symbol, *args ) #:nodoc:
41
102
  class_name = nil
42
103
  if symbol.id2name =~ /^get_(.*)/
43
- class_name = $1.capitalize
44
- class_name.gsub!( /_(\w)/ ) { |s| $1.capitalize }
45
- unless %w( Dir File FileUtils ).include?( class_name )
46
- class_name = nil
47
- end
48
- end
49
- if class_name
50
- if @@mock
51
- return_class = Class.by_name( 'MockFS::' + class_name + 'Adapter' )
104
+ result = self.send( $1, *args )
105
+ warn "MockFS.#{ symbol.id2name } is deprecated, use #{ $1 } instead"
106
+ result
107
+ else
108
+ klass = real_class_or_mock_class symbol
109
+ if klass
110
+ klass
52
111
  else
53
- return_class = Class.by_name( class_name )
112
+ @@mock ? mock_file_system.send( symbol, *args ) : super
54
113
  end
55
- return_class || super
56
- elsif @@mock
57
- mock_file_system.send( symbol, *args )
58
- else
59
- super
60
114
  end
61
115
  end
62
116
 
@@ -70,6 +124,20 @@ module MockFS
70
124
  @@mock ? MockFileSystem.instance : ( raise RuntimeError )
71
125
  end
72
126
 
127
+ def self.real_class_or_mock_class( symbol ) #:nodoc:
128
+ class_name = symbol.id2name.capitalize
129
+ class_name.gsub!( /_(\w)/ ) { |s| $1.capitalize }
130
+ if %w( Dir File FileUtils ).include?( class_name )
131
+ if @@mock
132
+ Class.by_name( 'MockFS::' + class_name + 'Adapter' )
133
+ else
134
+ Class.by_name( class_name )
135
+ end
136
+ else
137
+ nil
138
+ end
139
+ end
140
+
73
141
  module Adapter #:nodoc:
74
142
  @@delegated_methods = [ :delete, :entries, :mtime ]
75
143
 
@@ -101,7 +169,10 @@ module MockFS
101
169
  unless get_node( dirname ).class == MockFileSystem::MockDir
102
170
  raise Errno::ENOTDIR
103
171
  end
172
+ @dirname = dirname
104
173
  end
174
+
175
+ def entries; self.class.entries( @dirname ); end
105
176
  end
106
177
 
107
178
  class FileAdapter #:nodoc:
@@ -124,38 +195,53 @@ module MockFS
124
195
  alias_method :exists?, :exist?
125
196
  end
126
197
 
127
- def self.open( fd, mode_string = File::RDONLY, &action )
128
- if mode_string.class == String
129
- if mode_string == 'w'
130
- mode_string = File::WRONLY
131
- end
132
- end
133
- if mode_string == File::RDONLY
134
- node = get_node( fd )
135
- if node && node.permissions && node.permissions[0] == 0
136
- raise Errno::EACCES
137
- end
138
- result = action.call( node )
139
- node.rewind
140
- result
198
+ def self.get_mock_file( fd, mode ) #:nodoc:
199
+ if mode.read_only?
200
+ mock_file = get_node( fd )
201
+ raise Errno::EACCES if mock_file and !mock_file.readable?
141
202
  else
142
203
  path = Path.new( fd ).absolute
143
204
  dir = get_node( path.parent )
144
- if ( mode_string & File::APPEND > 0 )
205
+ if mode.append?
145
206
  mock_file = get_node( fd )
146
207
  else
147
208
  mock_file = MockFileSystem::MockFile.new( dir, path.node, '' )
148
209
  end
149
- if ( mode_string & File::APPEND == File::APPEND )
150
- mock_file.pos = mock_file.size
151
- end
152
- action.call( mock_file )
210
+ end
211
+ mock_file
212
+ end
213
+
214
+ def self.open( fd, mode_string = File::RDONLY, &action )
215
+ mode = Mode.new mode_string
216
+ mock_file = get_mock_file( fd, mode )
217
+ mock_file.pos = mock_file.size if mode.append?
218
+ if action
219
+ result = action.call( mock_file )
153
220
  mock_file.rewind
154
- if ( mode_string & File::APPEND == 0 )
155
- dir[path.node] = mock_file
221
+ if !mode.read_only? and !mode.append?
222
+ mock_file.parent[Path.new( fd ).absolute.node] = mock_file
156
223
  end
224
+ result
225
+ else
226
+ mock_file
157
227
  end
158
228
  end
229
+
230
+ class Mode
231
+ def initialize( string_or_bitwise )
232
+ if string_or_bitwise.is_a?( String )
233
+ if string_or_bitwise == 'w'
234
+ @bitwise = File::WRONLY
235
+ end
236
+ else
237
+ @bitwise = string_or_bitwise
238
+ end
239
+ end
240
+
241
+ def append?; @bitwise & File::APPEND == File::APPEND; end
242
+
243
+ def read_only?; @bitwise == File::RDONLY; end
244
+ end
159
245
  end
160
246
 
161
247
  class FileUtilsAdapter #:nodoc:
@@ -164,17 +250,27 @@ module MockFS
164
250
  def self.cp( src, dest, options = {} )
165
251
  file = get_node( src ).clone
166
252
  dest_path = Path.new( dest ).absolute
167
- dest_dir = get_node( dest_path.parent )
253
+ if MockFS.file.exist?( dest )
254
+ maybe_dest_dir = get_node dest_path
255
+ if maybe_dest_dir.is_a? MockFileSystem::MockDir
256
+ dest_path << ( '/' + Path.new( src ).absolute.node )
257
+ end
258
+ end
259
+ dest_dir = get_node dest_path.parent
168
260
  dest_dir[dest_path.node] = file
169
261
  file.name = dest_path.node
170
262
  file.parent = dest_dir
171
263
  end
172
264
 
173
- def self.mv( src, dest, options = {} )
174
- cp( src, dest, options )
175
- MockFS.get_file.delete( src )
265
+ class << self
266
+ def mv( src, dest, options = {} )
267
+ cp( src, dest, options )
268
+ MockFS.file.delete( src )
269
+ end
270
+
271
+ alias_method :move, :mv
176
272
  end
177
-
273
+
178
274
  def self.touch( file )
179
275
  begin
180
276
  get_node( file ).mtime = Time.now
@@ -215,6 +311,10 @@ module MockFS
215
311
 
216
312
  module Node #:nodoc:
217
313
  attr_accessor :mtime, :name, :parent, :permissions
314
+
315
+ def readable?
316
+ !permissions or permissions[0] != 0
317
+ end
218
318
  end
219
319
 
220
320
  class MockDir < DelegateClass( Hash ) #:nodoc:
@@ -264,8 +364,12 @@ module MockFS
264
364
 
265
365
  def fill_path( dirname )
266
366
  if dirname.size > 1
267
- dir = fill_dir( dirname.first )
268
- dir.fill_path( dirname[1..-1] )
367
+ if dirname.first != '..'
368
+ dir = fill_dir( dirname.first )
369
+ dir.fill_path( dirname[1..-1] )
370
+ else
371
+ parent.fill_path( dirname[1..-1] )
372
+ end
269
373
  else
270
374
  fill_dir( dirname )
271
375
  end
@@ -290,6 +394,8 @@ module MockFS
290
394
  clone.mtime = @mtime
291
395
  clone
292
396
  end
397
+
398
+ def close; rewind; end
293
399
 
294
400
  def delete; parent.delete( self ); end
295
401
 
data/lib/mockfs.rb~ CHANGED
@@ -2,12 +2,12 @@
2
2
  # It provides mock objects that clone the functionality of File, FileUtils,
3
3
  # Dir, and other in-Ruby file-access libraries.
4
4
  #
5
- # To use MockFS in your production code, call MockFS.get_[ class ].
5
+ # To use MockFS in your production code, call MockFS.[ class ].
6
6
  #
7
- # MockFS.get_file => File
8
- # MockFS.get_file_utils => FileUtils
9
- # MockFS.get_dir => Dir
10
- # MockFS.get_dir.entries( '.' ) => [".", "..", ...]
7
+ # MockFS.file => File
8
+ # MockFS.file_utils => FileUtils
9
+ # MockFS.dir => Dir
10
+ # MockFS.dir.entries( '.' ) => [".", "..", ...]
11
11
  #
12
12
  # Then, to turn these into mock instances for a test case, simply call
13
13
  #
@@ -16,14 +16,75 @@
16
16
  # When you've done this, the normal calls will actually return adapters that
17
17
  # pretend to be the class in question:
18
18
  #
19
- # MockFS.get_file => MockFS::FileAdapter
20
- # MockFS.get_file_utils => MockFS::FileUtilsAdapter
21
- # MockFS.get_dir => MockFS::DirAdapter
22
- # MockFS.get_dir.entries( '.' ) => [".", "..", ...]
19
+ # MockFS.file => MockFS::FileAdapter
20
+ # MockFS.file_utils => MockFS::FileUtilsAdapter
21
+ # MockFS.dir => MockFS::DirAdapter
22
+ # MockFS.dir.entries( '.' ) => [".", "..", ...]
23
23
  #
24
24
  # You can get direct access to the enclosed MockFileSystem by calling
25
25
  # MockFS.mock_file_system.
26
26
  #
27
+ # == Testing example
28
+ #
29
+ # For example, let's test a simple function that moves a log file into
30
+ # somebody's home directory.
31
+ #
32
+ # require 'mockfs'
33
+ #
34
+ # def move_log
35
+ # MockFS.file_utils.mv( '/var/log/httpd/access_log', '/home/francis/logs/' )
36
+ # end
37
+ #
38
+ # A test of this functionality might look like this:
39
+ #
40
+ # require 'test/unit'
41
+ #
42
+ # class TestMoveLog < Test::Unit::TestCase
43
+ # def test_move_log
44
+ # # Set MockFS to use the mock file system
45
+ # MockFS.mock = true
46
+ #
47
+ # # Fill certain directories
48
+ # MockFS.fill_path '/var/log/httpd/'
49
+ # MockFS.fill_path '/home/francis/logs/'
50
+ #
51
+ # # Create the access log
52
+ # MockFS.file.open( '/var/log/httpd/access_log', File::CREAT ) do |f|
53
+ # f.puts "line 1 of the access log"
54
+ # end
55
+ #
56
+ # # Run the method
57
+ # move_log
58
+ #
59
+ # # Test that it was moved, along with its contents
60
+ # assert( MockFS.file.exist?( '/home/francis/logs/access_log' ) )
61
+ # assert( !MockFS.file.exist?( '/var/log/httpd/access_log' ) )
62
+ # contents = MockFS.file.open( '/home/francis/logs/access_log' ) do |f|
63
+ # f.gets( nil )
64
+ # end
65
+ # assert_equal( "line 1 of the access log\n", contents )
66
+ # end
67
+ # end
68
+ #
69
+ # This test will be successful, and it won't litter your real file-system with
70
+ # testing files.
71
+ #
72
+ # == override.rb
73
+ #
74
+ # Reading the testing example above, you may be struck by one thing: Using
75
+ # MockFS requires you to remember to reference it everywhere, making calls such
76
+ # as MockFS.file_utils.mv instead of just FileUtils.mv. As another option, you
77
+ # can use File, FileUtils, and Dir directly, and then in your tests, substitute
78
+ # them by including mockfs/override.rb. I'd recommend using these with caution;
79
+ # substituting these low-level classes can have unpredictable results.
80
+ #
81
+ # Including override.rb also allows Kernel.require to look in your
82
+ # mock file system for mock Ruby files to include. You might find this useful
83
+ # if you have configuration files written in Ruby, and you'd like to swap them
84
+ # out for tests. This is pretty experimental, too.
85
+ #
86
+ # == Project page
87
+ #
27
88
  # You can view the Rubyforge project page at
28
89
  # http://rubyforge.org/projects/mockfs.
29
90
 
@@ -33,30 +94,23 @@ require 'fileutils'
33
94
  require 'singleton'
34
95
 
35
96
  module MockFS
36
- Version = '0.1.0'
97
+ Version = '0.1.1'
37
98
 
38
99
  @@mock = false
39
100
 
40
101
  def self.method_missing( symbol, *args ) #:nodoc:
41
102
  class_name = nil
42
103
  if symbol.id2name =~ /^get_(.*)/
43
- class_name = $1.capitalize
44
- class_name.gsub!( /_(\w)/ ) { |s| $1.capitalize }
45
- unless %w( Dir File FileUtils ).include?( class_name )
46
- class_name = nil
47
- end
48
- end
49
- if class_name
50
- if @@mock
51
- return_class = Class.by_name( 'MockFS::' + class_name + 'Adapter' )
104
+ result = self.send( $1, *args )
105
+ warn "MockFS.#{ symbol.id2name } is deprecated, use #{ $1 } instead"
106
+ result
107
+ else
108
+ klass = real_class_or_mock_class symbol
109
+ if klass
110
+ klass
52
111
  else
53
- return_class = Class.by_name( class_name )
112
+ @@mock ? mock_file_system.send( symbol, *args ) : super
54
113
  end
55
- return_class || super
56
- elsif @@mock
57
- mock_file_system.send( symbol, *args )
58
- else
59
- super
60
114
  end
61
115
  end
62
116
 
@@ -70,6 +124,20 @@ module MockFS
70
124
  @@mock ? MockFileSystem.instance : ( raise RuntimeError )
71
125
  end
72
126
 
127
+ def self.real_class_or_mock_class( symbol ) #:nodoc:
128
+ class_name = symbol.id2name.capitalize
129
+ class_name.gsub!( /_(\w)/ ) { |s| $1.capitalize }
130
+ if %w( Dir File FileUtils ).include?( class_name )
131
+ if @@mock
132
+ Class.by_name( 'MockFS::' + class_name + 'Adapter' )
133
+ else
134
+ Class.by_name( class_name )
135
+ end
136
+ else
137
+ nil
138
+ end
139
+ end
140
+
73
141
  module Adapter #:nodoc:
74
142
  @@delegated_methods = [ :delete, :entries, :mtime ]
75
143
 
@@ -101,7 +169,10 @@ module MockFS
101
169
  unless get_node( dirname ).class == MockFileSystem::MockDir
102
170
  raise Errno::ENOTDIR
103
171
  end
172
+ @dirname = dirname
104
173
  end
174
+
175
+ def entries; self.class.entries( @dirname ); end
105
176
  end
106
177
 
107
178
  class FileAdapter #:nodoc:
@@ -124,38 +195,53 @@ module MockFS
124
195
  alias_method :exists?, :exist?
125
196
  end
126
197
 
127
- def self.open( fd, mode_string = File::RDONLY, &action )
128
- if mode_string.class == String
129
- if mode_string == 'w'
130
- mode_string = File::WRONLY
131
- end
132
- end
133
- if mode_string == File::RDONLY
134
- node = get_node( fd )
135
- if node && node.permissions && node.permissions[0] == 0
136
- raise Errno::EACCES
137
- end
138
- result = action.call( node )
139
- node.rewind
140
- result
198
+ def self.get_mock_file( fd, mode ) #:nodoc:
199
+ if mode.read_only?
200
+ mock_file = get_node( fd )
201
+ raise Errno::EACCES if mock_file and !mock_file.readable?
141
202
  else
142
203
  path = Path.new( fd ).absolute
143
204
  dir = get_node( path.parent )
144
- if ( mode_string & File::APPEND > 0 )
205
+ if mode.append?
145
206
  mock_file = get_node( fd )
146
207
  else
147
208
  mock_file = MockFileSystem::MockFile.new( dir, path.node, '' )
148
209
  end
149
- if ( mode_string & File::APPEND == File::APPEND )
150
- mock_file.pos = mock_file.size
151
- end
152
- action.call( mock_file )
210
+ end
211
+ mock_file
212
+ end
213
+
214
+ def self.open( fd, mode_string = File::RDONLY, &action )
215
+ mode = Mode.new mode_string
216
+ mock_file = get_mock_file( fd, mode )
217
+ mock_file.pos = mock_file.size if mode.append?
218
+ if action
219
+ result = action.call( mock_file )
153
220
  mock_file.rewind
154
- if ( mode_string & File::APPEND == 0 )
155
- dir[path.node] = mock_file
221
+ if !mode.read_only? and !mode.append?
222
+ mock_file.parent[Path.new( fd ).absolute.node] = mock_file
156
223
  end
224
+ result
225
+ else
226
+ mock_file
157
227
  end
158
228
  end
229
+
230
+ class Mode
231
+ def initialize( string_or_bitwise )
232
+ if string_or_bitwise.is_a?( String )
233
+ if string_or_bitwise == 'w'
234
+ @bitwise = File::WRONLY
235
+ end
236
+ else
237
+ @bitwise = string_or_bitwise
238
+ end
239
+ end
240
+
241
+ def append?; @bitwise & File::APPEND == File::APPEND; end
242
+
243
+ def read_only?; @bitwise == File::RDONLY; end
244
+ end
159
245
  end
160
246
 
161
247
  class FileUtilsAdapter #:nodoc:
@@ -164,17 +250,27 @@ module MockFS
164
250
  def self.cp( src, dest, options = {} )
165
251
  file = get_node( src ).clone
166
252
  dest_path = Path.new( dest ).absolute
167
- dest_dir = get_node( dest_path.parent )
253
+ if MockFS.file.exist?( dest )
254
+ maybe_dest_dir = get_node dest_path
255
+ if maybe_dest_dir.is_a? MockFileSystem::MockDir
256
+ dest_path << ( '/' + Path.new( src ).absolute.node )
257
+ end
258
+ end
259
+ dest_dir = get_node dest_path.parent
168
260
  dest_dir[dest_path.node] = file
169
261
  file.name = dest_path.node
170
262
  file.parent = dest_dir
171
263
  end
172
264
 
173
- def self.mv( src, dest, options = {} )
174
- cp( src, dest, options )
175
- MockFS.get_file.delete( src )
265
+ class << self
266
+ def mv( src, dest, options = {} )
267
+ cp( src, dest, options )
268
+ MockFS.file.delete( src )
269
+ end
270
+
271
+ alias_method :move, :mv
176
272
  end
177
-
273
+
178
274
  def self.touch( file )
179
275
  begin
180
276
  get_node( file ).mtime = Time.now
@@ -215,6 +311,10 @@ module MockFS
215
311
 
216
312
  module Node #:nodoc:
217
313
  attr_accessor :mtime, :name, :parent, :permissions
314
+
315
+ def readable?
316
+ !permissions or permissions[0] != 0
317
+ end
218
318
  end
219
319
 
220
320
  class MockDir < DelegateClass( Hash ) #:nodoc:
@@ -264,8 +364,12 @@ module MockFS
264
364
 
265
365
  def fill_path( dirname )
266
366
  if dirname.size > 1
267
- dir = fill_dir( dirname.first )
268
- dir.fill_path( dirname[1..-1] )
367
+ if dirname.first != '..'
368
+ dir = fill_dir( dirname.first )
369
+ dir.fill_path( dirname[1..-1] )
370
+ else
371
+ parent.fill_path( dirname[1..-1] )
372
+ end
269
373
  else
270
374
  fill_dir( dirname )
271
375
  end
@@ -290,6 +394,8 @@ module MockFS
290
394
  clone.mtime = @mtime
291
395
  clone
292
396
  end
397
+
398
+ def close; rewind; end
293
399
 
294
400
  def delete; parent.delete( self ); end
295
401
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.1
2
+ rubygems_version: 0.8.6
3
3
  specification_version: 1
4
4
  name: mockfs
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
7
- date: 2005-02-23
6
+ version: 0.1.2
7
+ date: 2005-09-19
8
8
  summary: MockFS is a test-obsessed library for mocking out the entire file system.
9
9
  require_paths:
10
10
  - lib
11
- author: Francis Hwang
12
11
  email: sera@fhwang.net
13
12
  homepage: http://mockfs.rubyforge.org/
14
13
  rubyforge_project:
@@ -27,9 +26,14 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
27
26
  version: 0.0.0
28
27
  version:
29
28
  platform: ruby
29
+ authors:
30
+ - Francis Hwang
30
31
  files:
32
+ - lib/mockfs
31
33
  - lib/mockfs.rb
32
34
  - lib/mockfs.rb~
35
+ - lib/mockfs/override.rb
36
+ - lib/mockfs/override.rb~
33
37
  test_files: []
34
38
  rdoc_options: []
35
39
  extra_rdoc_files: []