1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
# frozen_string_literal: true
RealFile = File
RealFileTest = FileTest
RealFileUtils = FileUtils
RealDir = Dir
RealIO = IO
RealPathname = Pathname
def RealPathname(*args)
RealPathname.new(*args)
end
def Pathname(*args)
Pathname.new(*args)
end
# FakeFS module
module FakeFS
class << self
def activated?
@activated ||= false
end
# unconditionally activate
def activate!(io_mocks: false)
Object.class_eval do
remove_const(:Dir)
remove_const(:File)
remove_const(:FileTest)
remove_const(:FileUtils)
remove_const(:Pathname)
const_set(:Dir, FakeFS::Dir)
const_set(:File, FakeFS::File)
const_set(:FileUtils, FakeFS::FileUtils)
const_set(:FileTest, FakeFS::FileTest)
const_set(:Pathname, FakeFS::Pathname)
if io_mocks
remove_const(:IO)
const_set(:IO, ::FakeFS::IO)
end
::FakeFS::Kernel.hijack!
end
@activated = true
true
end
# unconditionally deactivate
def deactivate!
Object.class_eval do
remove_const(:Dir)
remove_const(:File)
remove_const(:FileTest)
remove_const(:FileUtils)
remove_const(:IO)
remove_const(:Pathname)
const_set(:Dir, RealDir)
const_set(:File, RealFile)
const_set(:FileTest, RealFileTest)
const_set(:FileUtils, RealFileUtils)
const_set(:IO, RealIO)
const_set(:Pathname, RealPathname)
::FakeFS::Kernel.unhijack!
end
@activated = false
true
end
# unconditionally clear the fake filesystem
def clear!
::FakeFS::FileSystem.clear
end
# present a fresh new fake filesystem to the block
def with_fresh(&block)
clear!
with(&block)
end
# present the fake filesystem to the block
def with
if activated?
yield
else
begin
activate!
yield
ensure
deactivate!
end
end
end
# present a non-fake filesystem to the block
def without
if !activated?
yield
else
begin
deactivate!
yield
ensure
activate!
end
end
end
end
end
def FakeFS(&block)
return ::FakeFS unless block
::FakeFS.with(&block)
end
|