fakefs 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CONTRIBUTORS +12 -0
- data/README.markdown +16 -16
- data/Rakefile +14 -0
- data/lib/fakefs/base.rb +3 -3
- data/lib/fakefs/dir.rb +1 -1
- data/lib/fakefs/fake/file.rb +8 -1
- data/lib/fakefs/file.rb +60 -53
- data/lib/fakefs/file_system.rb +19 -1
- data/lib/fakefs/fileutils.rb +9 -2
- data/lib/fakefs/spec_helpers.rb +46 -0
- data/lib/fakefs/version.rb +1 -1
- data/spec/fakefs/spec_helpers_spec.rb +57 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +3 -0
- data/test/fake/symlink_test.rb +4 -3
- data/test/fakefs_test.rb +185 -0
- data/test/safe_test.rb +13 -0
- metadata +10 -2
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.sw?
|
data/CONTRIBUTORS
ADDED
data/README.markdown
CHANGED
@@ -48,6 +48,13 @@ Don't Fake the FS Immediately
|
|
48
48
|
end
|
49
49
|
|
50
50
|
|
51
|
+
RSpec
|
52
|
+
-----------------------------
|
53
|
+
The above approach works with RSpec as well. In addition to this you may use the
|
54
|
+
'use_fakefs' macro to turn FakeFS on and off in a given example group. See
|
55
|
+
lib/spec_helpers for more details on it's usage.
|
56
|
+
|
57
|
+
|
51
58
|
How is this different than MockFS?
|
52
59
|
----------------------------------
|
53
60
|
|
@@ -56,6 +63,14 @@ test-time dependency: your actual library does not need to use or know about
|
|
56
63
|
FakeFS.
|
57
64
|
|
58
65
|
|
66
|
+
Caveats
|
67
|
+
-------
|
68
|
+
|
69
|
+
FakeFS internally uses the `Pathname` and `FileUtils` constants. If you use
|
70
|
+
these in your app, be certain you're properly requiring them and not counting
|
71
|
+
on FakeFS' own require.
|
72
|
+
|
73
|
+
|
59
74
|
Speed?
|
60
75
|
------
|
61
76
|
<http://gist.github.com/156091>
|
@@ -73,26 +88,11 @@ Installation
|
|
73
88
|
$ rip install git://github.com/defunkt/fakefs.git
|
74
89
|
|
75
90
|
|
76
|
-
Contributors
|
77
|
-
------------
|
78
|
-
|
79
|
-
* Chris Wanstrath
|
80
|
-
* David Reese
|
81
|
-
* Jeff Hodges
|
82
|
-
* Jon Yurek
|
83
|
-
* Matt Freels
|
84
|
-
* Myles Eftos
|
85
|
-
* Pat Nakajima
|
86
|
-
* Rob Sanheim
|
87
|
-
* Scott Taylor
|
88
|
-
* Tymon Tobolski
|
89
|
-
* msassak
|
90
|
-
|
91
|
-
|
92
91
|
Meta
|
93
92
|
----
|
94
93
|
|
95
94
|
* Code: `git clone git://github.com/defunkt/fakefs.git`
|
95
|
+
* Home: <http://github.com/defunkt/fakefs>
|
96
96
|
* Docs: <http://defunkt.github.com/fakefs>
|
97
97
|
* Bugs: <http://github.com/defunkt/fakefs/issues>
|
98
98
|
* List: <http://groups.google.com/group/fakefs>
|
data/Rakefile
CHANGED
@@ -31,3 +31,17 @@ begin
|
|
31
31
|
rescue LoadError
|
32
32
|
puts "sdoc support not enabled. Please gem install sdoc-helpers."
|
33
33
|
end
|
34
|
+
|
35
|
+
desc "Build a gem"
|
36
|
+
task :gem => [ :gemspec, :build ]
|
37
|
+
|
38
|
+
desc "Push a new version to Gemcutter"
|
39
|
+
task :publish => [ :gemspec, :build ] do
|
40
|
+
abort("Tests failed!") unless system("rake test")
|
41
|
+
system "git tag v#{FakeFS::Version}"
|
42
|
+
system "git push origin v#{FakeFS::Version}"
|
43
|
+
system "git push origin master"
|
44
|
+
system "gem push pkg/fakefs-#{FakeFS::Version}.gem"
|
45
|
+
system "git clean -fd"
|
46
|
+
exec "rake pages"
|
47
|
+
end
|
data/lib/fakefs/base.rb
CHANGED
data/lib/fakefs/dir.rb
CHANGED
data/lib/fakefs/fake/file.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module FakeFS
|
2
2
|
class FakeFile
|
3
|
-
attr_accessor :name, :parent
|
3
|
+
attr_accessor :name, :parent, :content, :mtime
|
4
4
|
|
5
5
|
class Inode
|
6
6
|
def initialize(file_owner)
|
@@ -19,12 +19,19 @@ module FakeFS
|
|
19
19
|
def unlink(file)
|
20
20
|
links.delete(file)
|
21
21
|
end
|
22
|
+
|
23
|
+
def clone
|
24
|
+
clone = super
|
25
|
+
clone.content = content.dup
|
26
|
+
clone
|
27
|
+
end
|
22
28
|
end
|
23
29
|
|
24
30
|
def initialize(name = nil, parent = nil)
|
25
31
|
@name = name
|
26
32
|
@parent = parent
|
27
33
|
@inode = Inode.new(self)
|
34
|
+
@mtime = Time.now
|
28
35
|
end
|
29
36
|
|
30
37
|
attr_accessor :inode
|
data/lib/fakefs/file.rb
CHANGED
@@ -13,19 +13,18 @@ module FakeFS
|
|
13
13
|
|
14
14
|
FILE_CREATION_MODES = MODES - [READ_ONLY, READ_WRITE]
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
]
|
16
|
+
MODE_BITMASK = RealFile::RDONLY |
|
17
|
+
RealFile::WRONLY |
|
18
|
+
RealFile::RDWR |
|
19
|
+
RealFile::APPEND |
|
20
|
+
RealFile::CREAT |
|
21
|
+
RealFile::EXCL |
|
22
|
+
RealFile::NONBLOCK |
|
23
|
+
RealFile::TRUNC |
|
24
|
+
RealFile::NOCTTY |
|
25
|
+
RealFile::SYNC
|
26
|
+
|
27
|
+
FILE_CREATION_BITMASK = RealFile::CREAT
|
29
28
|
|
30
29
|
def self.extname(path)
|
31
30
|
RealFile.extname(path)
|
@@ -41,12 +40,32 @@ module FakeFS
|
|
41
40
|
|
42
41
|
class << self
|
43
42
|
alias_method :exists?, :exist?
|
43
|
+
|
44
|
+
# Assuming that everyone can read and write files
|
45
|
+
alias_method :readable?, :exist?
|
46
|
+
alias_method :writable?, :exist?
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.mtime(path)
|
50
|
+
if exists?(path)
|
51
|
+
FileSystem.find(path).mtime
|
52
|
+
else
|
53
|
+
raise Errno::ENOENT
|
54
|
+
end
|
44
55
|
end
|
45
56
|
|
46
57
|
def self.size(path)
|
47
58
|
read(path).length
|
48
59
|
end
|
49
60
|
|
61
|
+
def self.size?(path)
|
62
|
+
if exists?(path) && !size(path).zero?
|
63
|
+
true
|
64
|
+
else
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
50
69
|
def self.const_missing(name)
|
51
70
|
RealFile.const_get(name)
|
52
71
|
end
|
@@ -114,7 +133,7 @@ module FakeFS
|
|
114
133
|
def self.readlines(path)
|
115
134
|
read(path).split("\n")
|
116
135
|
end
|
117
|
-
|
136
|
+
|
118
137
|
def self.link(source, dest)
|
119
138
|
if directory?(source)
|
120
139
|
raise Errno::EPERM, "Operation not permitted - #{source} or #{dest}"
|
@@ -123,11 +142,11 @@ module FakeFS
|
|
123
142
|
if !exists?(source)
|
124
143
|
raise Errno::ENOENT, "No such file or directory - #{source} or #{dest}"
|
125
144
|
end
|
126
|
-
|
145
|
+
|
127
146
|
if exists?(dest)
|
128
147
|
raise Errno::EEXIST, "File exists - #{source} or #{dest}"
|
129
148
|
end
|
130
|
-
|
149
|
+
|
131
150
|
source = FileSystem.find(source)
|
132
151
|
dest = FileSystem.add(dest, source.entry.clone)
|
133
152
|
source.link(dest)
|
@@ -191,75 +210,67 @@ module FakeFS
|
|
191
210
|
@file = FileSystem.find(path)
|
192
211
|
@open = true
|
193
212
|
|
194
|
-
|
213
|
+
check_modes!
|
214
|
+
|
195
215
|
file_creation_mode? ? create_missing_file : check_file_existence!
|
196
|
-
|
216
|
+
|
217
|
+
@stream = StringIO.new(@file.content, mode)
|
197
218
|
end
|
198
219
|
|
199
220
|
def close
|
200
221
|
@open = false
|
201
222
|
end
|
202
223
|
|
203
|
-
def read
|
204
|
-
|
205
|
-
|
224
|
+
def read(chunk = nil)
|
225
|
+
@stream.read(chunk)
|
226
|
+
end
|
206
227
|
|
207
|
-
|
228
|
+
def rewind
|
229
|
+
@stream.rewind
|
208
230
|
end
|
209
231
|
|
210
232
|
def exists?
|
211
|
-
|
233
|
+
true
|
212
234
|
end
|
213
235
|
|
214
236
|
def puts(*content)
|
215
|
-
content
|
216
|
-
write(obj.to_s + "\n")
|
217
|
-
end
|
237
|
+
@stream.puts(*content)
|
218
238
|
end
|
219
239
|
|
220
240
|
def write(content)
|
221
|
-
|
222
|
-
raise IOError, 'not open for writing' if read_only?
|
223
|
-
|
224
|
-
@file.content += content
|
241
|
+
@stream.write(content)
|
225
242
|
end
|
226
243
|
alias_method :print, :write
|
227
244
|
alias_method :<<, :write
|
228
245
|
|
229
246
|
def flush; self; end
|
230
247
|
|
248
|
+
def seek(amount, whence = SEEK_SET)
|
249
|
+
@stream.seek(amount, whence)
|
250
|
+
end
|
251
|
+
|
231
252
|
private
|
232
253
|
|
254
|
+
def check_modes!
|
255
|
+
StringIO.new("", @mode)
|
256
|
+
end
|
257
|
+
|
233
258
|
def check_file_existence!
|
234
259
|
unless @file
|
235
260
|
raise Errno::ENOENT, "No such file or directory - #{@file}"
|
236
261
|
end
|
237
262
|
end
|
238
263
|
|
239
|
-
def check_valid_mode
|
240
|
-
if !mode_in?(MODES)
|
241
|
-
raise ArgumentError, "illegal access mode #{@mode}"
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
def read_only?
|
246
|
-
mode_in? READ_ONLY_MODES
|
247
|
-
end
|
248
|
-
|
249
264
|
def file_creation_mode?
|
250
|
-
mode_in?
|
251
|
-
end
|
252
|
-
|
253
|
-
def write_only?
|
254
|
-
mode_in? WRITE_ONLY_MODES
|
265
|
+
mode_in?(FILE_CREATION_MODES) || mode_in_bitmask?(FILE_CREATION_BITMASK)
|
255
266
|
end
|
256
267
|
|
257
|
-
def
|
258
|
-
|
268
|
+
def mode_in?(list)
|
269
|
+
list.any? { |element| @mode.include?(element) } if @mode.respond_to?(:include?)
|
259
270
|
end
|
260
271
|
|
261
|
-
def
|
262
|
-
|
272
|
+
def mode_in_bitmask?(mask)
|
273
|
+
(@mode & mask) != 0 if @mode.is_a?(Integer)
|
263
274
|
end
|
264
275
|
|
265
276
|
def create_missing_file
|
@@ -267,9 +278,5 @@ module FakeFS
|
|
267
278
|
@file = FileSystem.add(path, FakeFile.new)
|
268
279
|
end
|
269
280
|
end
|
270
|
-
|
271
|
-
def truncate_file
|
272
|
-
@file.content = ""
|
273
|
-
end
|
274
281
|
end
|
275
282
|
end
|
data/lib/fakefs/file_system.rb
CHANGED
@@ -106,7 +106,20 @@ module FakeFS
|
|
106
106
|
return [] unless dir.respond_to? :[]
|
107
107
|
|
108
108
|
pattern , *parts = parts
|
109
|
-
matches =
|
109
|
+
matches = case pattern
|
110
|
+
when '**'
|
111
|
+
case parts
|
112
|
+
when ['*'], []
|
113
|
+
parts = [] # end recursion
|
114
|
+
directories_under(dir).map do |d|
|
115
|
+
d.values.select{|f| f.is_a? FakeFile }
|
116
|
+
end.flatten.uniq
|
117
|
+
else
|
118
|
+
directories_under(dir)
|
119
|
+
end
|
120
|
+
else
|
121
|
+
dir.reject {|k,v| /\A#{pattern.gsub('?','.').gsub('*', '.*')}\Z/ !~ k }.values
|
122
|
+
end
|
110
123
|
|
111
124
|
if parts.empty? # we're done recursing
|
112
125
|
matches
|
@@ -114,5 +127,10 @@ module FakeFS
|
|
114
127
|
matches.map{|entry| find_recurser(entry, parts) }
|
115
128
|
end
|
116
129
|
end
|
130
|
+
|
131
|
+
def directories_under(dir)
|
132
|
+
children = dir.values.select{|f| f.is_a? FakeDir}
|
133
|
+
([dir] + children + children.map{|c| directories_under(c)}).flatten.uniq
|
134
|
+
end
|
117
135
|
end
|
118
136
|
end
|
data/lib/fakefs/fileutils.rb
CHANGED
@@ -25,11 +25,18 @@ module FakeFS
|
|
25
25
|
|
26
26
|
alias_method :rm_rf, :rm
|
27
27
|
alias_method :rm_r, :rm
|
28
|
+
alias_method :rm_f, :rm
|
28
29
|
|
29
|
-
def ln_s(target, path)
|
30
|
-
|
30
|
+
def ln_s(target, path, options = {})
|
31
|
+
options = { :force => false }.merge(options)
|
32
|
+
(FileSystem.find(path) and !options[:force]) ? raise(Errno::EEXIST, path) : FileSystem.delete(path)
|
31
33
|
FileSystem.add(path, FakeSymlink.new(target))
|
32
34
|
end
|
35
|
+
def ln_sf(target, path)
|
36
|
+
ln_s(target, path, { :force => true })
|
37
|
+
end
|
38
|
+
|
39
|
+
|
33
40
|
|
34
41
|
def cp(src, dest)
|
35
42
|
dst_file = FileSystem.find(dest)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# FakeFS::SpecHelpers provides a simple macro for RSpec example groups to turn FakeFS on and off.
|
2
|
+
# To use it simply require 'fakefs/spec_helpers', then include FakeFS::SpecHelpers into any
|
3
|
+
# example groups that you wish to use FakeFS in. For example:
|
4
|
+
#
|
5
|
+
# require 'fakefs/spec_helpers'
|
6
|
+
#
|
7
|
+
# describe "Some specs that deal with files" do
|
8
|
+
# include FakeFS::SpecHelpers
|
9
|
+
# ...
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# Alternatively, you can include FakeFS::SpecHelpers in all your example groups using RSpec's
|
13
|
+
# configuration block in your spec helper:
|
14
|
+
#
|
15
|
+
# require 'fakefs/spec_helpers'
|
16
|
+
#
|
17
|
+
# Spec::Runner.configure do |config|
|
18
|
+
# config.include FakeFS::SpecHelpers
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# If you do the above then use_fakefs will be available in all of your example groups.
|
22
|
+
#
|
23
|
+
require 'fakefs/safe'
|
24
|
+
|
25
|
+
module FakeFS
|
26
|
+
module SpecHelpers
|
27
|
+
def self.extended(example_group)
|
28
|
+
example_group.use_fakefs(example_group)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.included(example_group)
|
32
|
+
example_group.extend self
|
33
|
+
end
|
34
|
+
|
35
|
+
def use_fakefs(describe_block)
|
36
|
+
describe_block.before :each do
|
37
|
+
FakeFS.activate!
|
38
|
+
end
|
39
|
+
|
40
|
+
describe_block.after :each do
|
41
|
+
FakeFS.deactivate!
|
42
|
+
FakeFS::FileSystem.clear
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/fakefs/version.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module FakeFS
|
4
|
+
describe SpecHelpers do
|
5
|
+
before do
|
6
|
+
@rspec_example_group = Class.new do
|
7
|
+
def self.before(sym = :each)
|
8
|
+
yield if block_given?
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.after(sym = :each)
|
12
|
+
yield if block_given?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "when extending" do
|
18
|
+
context "before each" do
|
19
|
+
it "should call it" do
|
20
|
+
@rspec_example_group.should_receive(:before).with(:each)
|
21
|
+
@rspec_example_group.extend FakeFS::SpecHelpers
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should call FakeFS.activate!" do
|
25
|
+
FakeFS.should_receive(:activate!)
|
26
|
+
@rspec_example_group.extend FakeFS::SpecHelpers
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "after each" do
|
31
|
+
it "should call it" do
|
32
|
+
@rspec_example_group.should_receive(:after).with(:each)
|
33
|
+
@rspec_example_group.extend FakeFS::SpecHelpers
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should deactivate fakefs" do
|
37
|
+
FakeFS.should_receive(:deactivate!)
|
38
|
+
@rspec_example_group.extend FakeFS::SpecHelpers
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should clear the fakefs filesystem for the next run" do
|
42
|
+
FakeFS::FileSystem.should_receive(:clear)
|
43
|
+
@rspec_example_group.extend FakeFS::SpecHelpers
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "when including" do
|
49
|
+
it "should call before :each" do
|
50
|
+
@rspec_example_group.should_receive(:before)
|
51
|
+
@rspec_example_group.class_eval do
|
52
|
+
include FakeFS::SpecHelpers
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
data/test/fake/symlink_test.rb
CHANGED
@@ -4,8 +4,9 @@ require 'test/unit'
|
|
4
4
|
|
5
5
|
class FakeSymlinkTest < Test::Unit::TestCase
|
6
6
|
include FakeFS
|
7
|
-
|
7
|
+
|
8
8
|
def test_symlink_has_method_missing_as_private
|
9
|
-
|
9
|
+
methods = FakeSymlink.private_instance_methods.map { |m| m.to_s }
|
10
|
+
assert methods.include?("method_missing")
|
10
11
|
end
|
11
|
-
end
|
12
|
+
end
|
data/test/fakefs_test.rb
CHANGED
@@ -74,6 +74,20 @@ class FakeFSTest < Test::Unit::TestCase
|
|
74
74
|
FileUtils.ln_s(target, '/path/to/link')
|
75
75
|
end
|
76
76
|
end
|
77
|
+
|
78
|
+
def test_can_force_creation_of_symlinks
|
79
|
+
FileUtils.mkdir_p(target = "/path/to/first/target")
|
80
|
+
FileUtils.ln_s(target, "/path/to/link")
|
81
|
+
assert_kind_of FakeSymlink, FileSystem.fs['path']['to']['link']
|
82
|
+
FileUtils.ln_s(target, '/path/to/link', :force => true)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_create_symlink_using_ln_sf
|
86
|
+
FileUtils.mkdir_p(target = "/path/to/first/target")
|
87
|
+
FileUtils.ln_s(target, "/path/to/link")
|
88
|
+
assert_kind_of FakeSymlink, FileSystem.fs['path']['to']['link']
|
89
|
+
FileUtils.ln_sf(target, '/path/to/link')
|
90
|
+
end
|
77
91
|
|
78
92
|
def test_can_follow_symlinks
|
79
93
|
FileUtils.mkdir_p(target = "/path/to/target")
|
@@ -94,6 +108,19 @@ class FakeFSTest < Test::Unit::TestCase
|
|
94
108
|
end
|
95
109
|
|
96
110
|
assert File.exists?(path)
|
111
|
+
assert File.readable?(path)
|
112
|
+
assert File.writable?(path)
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_can_create_files_with_bitmasks
|
116
|
+
path = '/path/to/file.txt'
|
117
|
+
File.open(path, File::RDWR | File::CREAT) do |f|
|
118
|
+
f.write "Yatta!"
|
119
|
+
end
|
120
|
+
|
121
|
+
assert File.exists?(path)
|
122
|
+
assert File.readable?(path)
|
123
|
+
assert File.writable?(path)
|
97
124
|
end
|
98
125
|
|
99
126
|
def test_file_opens_in_read_only_mode
|
@@ -106,6 +133,16 @@ class FakeFSTest < Test::Unit::TestCase
|
|
106
133
|
end
|
107
134
|
end
|
108
135
|
|
136
|
+
def test_file_opens_in_read_only_mode_with_bitmasks
|
137
|
+
File.open("foo", "w") { |f| f << "foo" }
|
138
|
+
|
139
|
+
f = File.open("foo", File::RDONLY)
|
140
|
+
|
141
|
+
assert_raises(IOError) do
|
142
|
+
f << "bar"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
109
146
|
def test_file_opens_in_invalid_mode
|
110
147
|
FileUtils.touch("foo")
|
111
148
|
|
@@ -131,6 +168,17 @@ class FakeFSTest < Test::Unit::TestCase
|
|
131
168
|
assert File.exists?("foo")
|
132
169
|
end
|
133
170
|
|
171
|
+
def test_creates_files_in_write_only_mode_with_bitmasks
|
172
|
+
File.open("foo", File::WRONLY | File::CREAT)
|
173
|
+
assert File.exists?("foo")
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_raises_in_write_only_mode_without_create_bitmask
|
177
|
+
assert_raises(Errno::ENOENT) do
|
178
|
+
File.open("foo", File::WRONLY)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
134
182
|
def test_creates_files_in_read_write_truncate_mode
|
135
183
|
File.open("foo", "w+")
|
136
184
|
assert File.exists?("foo")
|
@@ -199,6 +247,30 @@ class FakeFSTest < Test::Unit::TestCase
|
|
199
247
|
assert_equal 'Yada Yada', File.read(path)
|
200
248
|
end
|
201
249
|
|
250
|
+
def test_raises_error_when_opening_with_binary_mode_only
|
251
|
+
assert_raise ArgumentError do
|
252
|
+
File.open("/foo", "b")
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_can_open_file_in_binary_mode
|
257
|
+
File.open("/foo", "wb") { |x| x << "a" }
|
258
|
+
assert_equal "a", File.read("/foo")
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_can_chunk_io_when_reading
|
262
|
+
path = '/path/to/file.txt'
|
263
|
+
File.open(path, 'w') do |f|
|
264
|
+
f << 'Yada Yada'
|
265
|
+
end
|
266
|
+
file = File.new(path, 'r')
|
267
|
+
assert_equal 'Yada', file.read(4)
|
268
|
+
assert_equal ' Yada', file.read(5)
|
269
|
+
assert_equal '', file.read
|
270
|
+
file.rewind
|
271
|
+
assert_equal 'Yada Yada', file.read
|
272
|
+
end
|
273
|
+
|
202
274
|
def test_can_get_size_of_files
|
203
275
|
path = '/path/to/file.txt'
|
204
276
|
File.open(path, 'w') do |f|
|
@@ -207,6 +279,37 @@ class FakeFSTest < Test::Unit::TestCase
|
|
207
279
|
assert_equal 9, File.size(path)
|
208
280
|
end
|
209
281
|
|
282
|
+
def test_can_check_if_file_has_size?
|
283
|
+
path = '/path/to/file.txt'
|
284
|
+
File.open(path, 'w') do |f|
|
285
|
+
f << 'Yada Yada'
|
286
|
+
end
|
287
|
+
assert File.size?(path)
|
288
|
+
assert_nil File.size?("/path/to/other.txt")
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_can_check_size?_of_empty_file
|
292
|
+
path = '/path/to/file.txt'
|
293
|
+
File.open(path, 'w') do |f|
|
294
|
+
f << ''
|
295
|
+
end
|
296
|
+
assert_nil File.size?("/path/to/file.txt")
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_raises_error_on_mtime_if_file_does_not_exist
|
300
|
+
assert_raise Errno::ENOENT do
|
301
|
+
File.mtime('/path/to/file.txt')
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_can_return_mtime_on_existing_file
|
306
|
+
path = '/path/to/file.txt'
|
307
|
+
File.open(path, 'w') do |f|
|
308
|
+
f << ''
|
309
|
+
end
|
310
|
+
assert File.mtime('/path/to/file.txt').is_a?(Time)
|
311
|
+
end
|
312
|
+
|
210
313
|
def test_can_read_with_File_readlines
|
211
314
|
path = '/path/to/file.txt'
|
212
315
|
File.open(path, 'w') do |f|
|
@@ -327,6 +430,21 @@ class FakeFSTest < Test::Unit::TestCase
|
|
327
430
|
#assert_equal ['/'], Dir['/']
|
328
431
|
end
|
329
432
|
|
433
|
+
def test_dir_glob_handles_recursive_globs
|
434
|
+
File.open('/one/two/three/four.rb', 'w')
|
435
|
+
File.open('/one/five.rb', 'w')
|
436
|
+
assert_equal ['/one/five.rb', '/one/two/three/four.rb'], Dir['/one/**/*.rb']
|
437
|
+
assert_equal ['/one/two'], Dir['/one/**/two']
|
438
|
+
assert_equal ['/one/two/three'], Dir['/one/**/three']
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_dir_recursive_glob_ending_in_wildcards_only_returns_files
|
442
|
+
File.open('/one/two/three/four.rb', 'w')
|
443
|
+
File.open('/one/five.rb', 'w')
|
444
|
+
assert_equal ['/one/five.rb', '/one/two/three/four.rb'], Dir['/one/**/*']
|
445
|
+
assert_equal ['/one/five.rb', '/one/two/three/four.rb'], Dir['/one/**']
|
446
|
+
end
|
447
|
+
|
330
448
|
def test_chdir_changes_directories_like_a_boss
|
331
449
|
# I know memes!
|
332
450
|
FileUtils.mkdir_p '/path'
|
@@ -851,6 +969,20 @@ class FakeFSTest < Test::Unit::TestCase
|
|
851
969
|
test.each { |t| assert yielded.include?(t) }
|
852
970
|
end
|
853
971
|
|
972
|
+
def test_directory_entries_works_with_trailing_slash
|
973
|
+
test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
|
974
|
+
|
975
|
+
FileUtils.mkdir_p('/this/path/should/be/here')
|
976
|
+
|
977
|
+
test.each do |f|
|
978
|
+
FileUtils.touch("/this/path/should/be/here/#{f}")
|
979
|
+
end
|
980
|
+
|
981
|
+
yielded = Dir.entries('/this/path/should/be/here/')
|
982
|
+
assert yielded.size == test.size
|
983
|
+
test.each { |t| assert yielded.include?(t) }
|
984
|
+
end
|
985
|
+
|
854
986
|
def test_directory_foreach
|
855
987
|
test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
|
856
988
|
|
@@ -1060,6 +1192,59 @@ class FakeFSTest < Test::Unit::TestCase
|
|
1060
1192
|
assert !File.exists?("/foo")
|
1061
1193
|
end
|
1062
1194
|
|
1195
|
+
def test_file_seek_returns_0
|
1196
|
+
File.open("/foo", "w") do |f|
|
1197
|
+
f << "one\ntwo\nthree"
|
1198
|
+
end
|
1199
|
+
|
1200
|
+
file = File.open("/foo", "r")
|
1201
|
+
|
1202
|
+
assert_equal 0, file.seek(1)
|
1203
|
+
end
|
1204
|
+
|
1205
|
+
def test_file_seek_seeks_to_location
|
1206
|
+
File.open("/foo", "w") do |f|
|
1207
|
+
f << "123"
|
1208
|
+
end
|
1209
|
+
|
1210
|
+
file = File.open("/foo", "r")
|
1211
|
+
file.seek(1)
|
1212
|
+
assert_equal "23", file.read
|
1213
|
+
end
|
1214
|
+
|
1215
|
+
def test_file_seek_seeks_to_correct_location
|
1216
|
+
File.open("/foo", "w") do |f|
|
1217
|
+
f << "123"
|
1218
|
+
end
|
1219
|
+
|
1220
|
+
file = File.open("/foo", "r")
|
1221
|
+
file.seek(2)
|
1222
|
+
assert_equal "3", file.read
|
1223
|
+
end
|
1224
|
+
|
1225
|
+
def test_file_seek_can_take_negative_offset
|
1226
|
+
File.open("/foo", "w") do |f|
|
1227
|
+
f << "123456789"
|
1228
|
+
end
|
1229
|
+
|
1230
|
+
file = File.open("/foo", "r")
|
1231
|
+
|
1232
|
+
file.seek(-1, IO::SEEK_END)
|
1233
|
+
assert_equal "9", file.read
|
1234
|
+
|
1235
|
+
file.seek(-2, IO::SEEK_END)
|
1236
|
+
assert_equal "89", file.read
|
1237
|
+
|
1238
|
+
file.seek(-3, IO::SEEK_END)
|
1239
|
+
assert_equal "789", file.read
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
def test_should_have_constants_inherited_from_descending_from_io
|
1243
|
+
assert_equal IO::SEEK_CUR, File::SEEK_CUR
|
1244
|
+
assert_equal IO::SEEK_END, File::SEEK_END
|
1245
|
+
assert_equal IO::SEEK_SET, File::SEEK_SET
|
1246
|
+
end
|
1247
|
+
|
1063
1248
|
def here(fname)
|
1064
1249
|
RealFile.expand_path(RealFile.dirname(__FILE__)+'/'+fname)
|
1065
1250
|
end
|
data/test/safe_test.rb
CHANGED
@@ -26,4 +26,17 @@ class FakeFSSafeTest < Test::Unit::TestCase
|
|
26
26
|
|
27
27
|
assert_equal result, "Yatta!"
|
28
28
|
end
|
29
|
+
|
30
|
+
def test_FakeFS_method_deactivates_FakeFS_when_block_raises_exception
|
31
|
+
begin
|
32
|
+
FakeFS do
|
33
|
+
raise 'boom!'
|
34
|
+
end
|
35
|
+
rescue
|
36
|
+
end
|
37
|
+
|
38
|
+
assert_equal RealFile, File, "File is #{File} (should be #{RealFile})"
|
39
|
+
assert_equal RealFileUtils, FileUtils, "FileUtils is #{FileUtils} (should be #{RealFileUtils})"
|
40
|
+
assert_equal RealDir, Dir, "Dir is #{Dir} (should be #{RealDir})"
|
41
|
+
end
|
29
42
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fakefs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wanstrath
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-30 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,6 +23,8 @@ extra_rdoc_files:
|
|
23
23
|
- LICENSE
|
24
24
|
- README.markdown
|
25
25
|
files:
|
26
|
+
- .gitignore
|
27
|
+
- CONTRIBUTORS
|
26
28
|
- LICENSE
|
27
29
|
- README.markdown
|
28
30
|
- Rakefile
|
@@ -36,7 +38,11 @@ files:
|
|
36
38
|
- lib/fakefs/file_system.rb
|
37
39
|
- lib/fakefs/fileutils.rb
|
38
40
|
- lib/fakefs/safe.rb
|
41
|
+
- lib/fakefs/spec_helpers.rb
|
39
42
|
- lib/fakefs/version.rb
|
43
|
+
- spec/fakefs/spec_helpers_spec.rb
|
44
|
+
- spec/spec.opts
|
45
|
+
- spec/spec_helper.rb
|
40
46
|
- test/fake/file_test.rb
|
41
47
|
- test/fake/symlink_test.rb
|
42
48
|
- test/fakefs_test.rb
|
@@ -72,6 +78,8 @@ signing_key:
|
|
72
78
|
specification_version: 3
|
73
79
|
summary: A fake filesystem. Use it in your tests.
|
74
80
|
test_files:
|
81
|
+
- spec/fakefs/spec_helpers_spec.rb
|
82
|
+
- spec/spec_helper.rb
|
75
83
|
- test/fake/file_test.rb
|
76
84
|
- test/fake/symlink_test.rb
|
77
85
|
- test/fakefs_test.rb
|