Skip to content

Commit 5ede6d5

Browse files
authored
Merge pull request #109 from mrbean-bremen/fake_io_open
Fake io open
2 parents e110e29 + 50a1969 commit 5ede6d5

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

fake_filesystem_unittest_test.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"""
1919
Test the :py:class`pyfakefs.fake_filesystem_unittest.TestCase` base class.
2020
"""
21-
21+
import io
2222
import os
2323
import glob
2424
import shutil
@@ -65,6 +65,17 @@ def test_open(self):
6565
self.assertEqual(content,
6666
'This test file was created using the open() function.\n')
6767

68+
def test_io_open(self):
69+
'''Fake io module is bound'''
70+
self.assertFalse(os.path.exists('/fake_file.txt'))
71+
with io.open('/fake_file.txt', 'w') as f:
72+
f.write("This test file was created using the io.open() function.\n")
73+
self.assertTrue(self.fs.Exists('/fake_file.txt'))
74+
with open('/fake_file.txt') as f:
75+
content = f.read()
76+
self.assertEqual(content,
77+
'This test file was created using the io.open() function.\n')
78+
6879
def test_os(self):
6980
'''Fake os module is bound'''
7081
self.assertFalse(self.fs.Exists('/test/dir1/dir2'))

pyfakefs/fake_filesystem.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2418,6 +2418,33 @@ def __getattr__(self, name):
24182418
"""Forwards any unfaked calls to the standard os module."""
24192419
return getattr(self._os_module, name)
24202420

2421+
class FakeIoModule(object):
2422+
"""Uses FakeFilesystem to provide a fake io module replacement.
2423+
Currently only used to wrap io.open() which is an alias to open()
2424+
2425+
# You need a fake_filesystem to use this:
2426+
filesystem = fake_filesystem.FakeFilesystem()
2427+
my_io_module = fake_filesystem.FakeIoModule(filesystem)
2428+
"""
2429+
2430+
def __init__(self, filesystem):
2431+
"""
2432+
Args:
2433+
filesystem: FakeFilesystem used to provide file system information
2434+
"""
2435+
self.filesystem = filesystem
2436+
2437+
def open(self, file_path, mode='r', buffering=-1, encoding=None,
2438+
errors=None, newline=None, closefd=True, opener=None):
2439+
"""Redirect the call to FakeFileOpen.
2440+
See FakeFileOpen.Call() for description.
2441+
"""
2442+
if opener is not None and sys.version_info < (3, 3):
2443+
raise TypeError("open() got an unexpected keyword argument 'opener'")
2444+
return FakeFileOpen(self.filesystem).Call(
2445+
file_path, mode, buffering, encoding, errors, newline, closefd, opener)
2446+
2447+
24212448
class FakeFileWrapper(object):
24222449
"""Wrapper for a StringIO object for use by a FakeFile object.
24232450

pyfakefs/fake_filesystem_unittest.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ class Patcher(object):
115115

116116
# To add py.test support per issue https://github.com/jmcgeheeiv/pyfakefs/issues/43,
117117
# it appears that adding 'py', 'pytest', '_pytest' to SKIPNAMES will help
118-
SKIPNAMES = set(['os', 'glob', 'path', 'shutil', 'tempfile'])
118+
SKIPNAMES = set(['os', 'glob', 'path', 'shutil', 'tempfile', 'io'])
119119

120120
def __init__(self):
121121
# Attributes set by _findModules()
@@ -124,6 +124,7 @@ def __init__(self):
124124
self._pathModules = None
125125
self._shutilModules = None
126126
self._tempfileModules = None
127+
self._ioModules = None
127128
self._findModules()
128129
assert None not in vars(self).values(), \
129130
"_findModules() missed the initialization of an instance variable"
@@ -137,6 +138,7 @@ def __init__(self):
137138
self.fake_shutil = None
138139
self.fake_tempfile_ = None
139140
self.fake_open = None
141+
self.fake_io = None
140142
# _isStale is set by tearDown(), reset by _refresh()
141143
self._isStale = True
142144
self._refresh()
@@ -154,6 +156,7 @@ def _findModules(self):
154156
self._pathModules = set()
155157
self._shutilModules = set()
156158
self._tempfileModules = set()
159+
self._ioModules = set()
157160
for name, module in set(sys.modules.items()):
158161
if (module in self.SKIPMODULES or
159162
(not inspect.ismodule(module)) or
@@ -169,6 +172,8 @@ def _findModules(self):
169172
self._shutilModules.add(module)
170173
if 'tempfile' in module.__dict__:
171174
self._tempfileModules.add(module)
175+
if 'io' in module.__dict__:
176+
self._ioModules.add(module)
172177

173178
def _refresh(self):
174179
'''Renew the fake file system and set the _isStale flag to `False`.'''
@@ -183,6 +188,7 @@ def _refresh(self):
183188
self.fake_shutil = fake_filesystem_shutil.FakeShutilModule(self.fs)
184189
self.fake_tempfile_ = fake_tempfile.FakeTempfileModule(self.fs)
185190
self.fake_open = fake_filesystem.FakeFileOpen(self.fs)
191+
self.fake_io = fake_filesystem.FakeIoModule(self.fs)
186192

187193
self._isStale = False
188194

@@ -211,6 +217,8 @@ def setUp(self, doctester=None):
211217
self._stubs.SmartSet(module, 'shutil', self.fake_shutil)
212218
for module in self._tempfileModules:
213219
self._stubs.SmartSet(module, 'tempfile', self.fake_tempfile_)
220+
for module in self._ioModules:
221+
self._stubs.SmartSet(module, 'io', self.fake_io)
214222

215223
def replaceGlobs(self, globs_):
216224
globs = globs_.copy()
@@ -228,6 +236,8 @@ def replaceGlobs(self, globs_):
228236
globs['shutil'] = fake_filesystem_shutil.FakeShutilModule(self.fs)
229237
if 'tempfile' in globs:
230238
globs['tempfile'] = fake_tempfile.FakeTempfileModule(self.fs)
239+
if 'io' in globs:
240+
globs['io'] = fake_filesystem.FakeIoModule(self.fs)
231241
return globs
232242

233243
def tearDown(self, doctester=None):

0 commit comments

Comments
 (0)